2016-03-01 54 views
2

我正在使用awk從日誌文件中去除有用的信息。這是我的日誌文件看起來是這樣的:在這個awk命令中應該設置什麼?

2016-02-19 20:18:46,861 115971,100126017,524,523,1,[144115198332971054] 
2016-02-19 20:18:46,874 95496,100126019,5,5,0,[] 
2016-02-19 20:18:46,883 115974,100126025,57,57,0,[] 
2016-02-19 20:18:46,891 115975,100126026,4,4,0,[] 
2016-02-19 20:18:46,918 115976,100126027,122,122,0,[] 
2016-02-19 20:18:47,688 115978,100126029,11656,11641,15,[144115198334490817,144115197319238988,144115197291063350,144115198332904743,144115197318718547,144115197319714394,144115197306930902,144115197250548791,144115198320676757,14411519 
7253880518,144115197289305237,144115198083289344,144115197319697491,144115198273784435,144115198081583082] 
2016-02-19 20:18:47,731 99590,100126032,12,12,0,[] 
2016-02-19 20:18:47,832 115982,100126034,1397,1396,1,[144115198273784435] 
2016-02-19 20:18:47,849 106705,100126035,31,31,0,[] 
2016-02-19 20:18:47,860 107469,100126036,16,16,0,[] 
2016-02-19 20:18:47,927 115983,100126037,824,824,0,[] 
2016-02-19 20:18:47,985 115985,100126039,564,564,0,[] 
2016-02-19 20:18:48,048 115986,100126040,338,338,0,[] 
2016-02-19 20:18:48,108 115987,100126041,259,259,0,[] 
2016-02-19 20:18:48,187 115989,100126043,693,692,1,[144115198273784435] 

我用","FS變量;我需要[]方括號中的全部內容,所以我試圖設置RS"]"

awk 'BEGIN { FS=","; RS="]";} { print $2 ,$3, $6 ,$7}' removed-apply.log.2016-02-19 

但結果是錯誤的:

861 115971 100126017 1 [144115198332971054] 
874 95496 100126019 0 [] 
883 115974 100126025 0 [] 
891 115975 100126026 0 [] 
918 115976 100126027 0 [] 
688 115978 100126029 15 [144115198334490817 
731 99590 100126032 0 [] 
832 115982 100126034 1 [144115198273784435] 
849 106705 100126035 0 [] 
860 107469 100126036 0 [] 
927 115983 100126037 0 [] 
985 115985 100126039 0 [] 
048 115986 100126040 0 [] 
108 115987 100126041 0 [] 
187 115989 100126043 1 [144115198273784435] 

看來RS仍然是換行符。

+0

TKS爲UR建議:d – JasonHuang

+0

TNX用於取建議;-)很高興你有一個解決方案。祝你們好運。 – shellter

回答

3

更新:關於第二個想法,你可以逃脫一輸入字段分離器正則表達式(通過選項-F規定,轉化爲可變FS):

awk -F ',\\[?|\\]' '{ print $2 ,$3, $6 ,$7 }' removed-apply.log.2016-02-19 

注的需要到double\實例將它們作爲文字生成正則表達式。 E.g,\\[awk的初始解析,這正則表達式解析然後看見作爲\[,導致解釋爲字面[變成字面\[。總之:字符串,\\[?|\\]結果正則表達式,\[?|\]


(如接受)原來的答覆:

你輸入依然清晰線爲本,所以沒有理由改變RS,輸入記錄分隔符。

相反,分析每一行中步驟:

  • 使用FS最初打破輸入到字段:[之前,和[...]之間。
    • 注意:下面使用的,[][]的奇怪的正則表達式,是含有2個文字字符,][一個字符集([...]);它在概念上等同於\[|\]
  • 然後,使用split(),每個產生的場分割成存儲在陣列子場:
awk ' 
    BEGIN { FS="[][]" } # split into $1 (before "[") and $2 (between "[...]") 
    { 
    split($1, fa1, ",") # split $1 into subfields by "," and store in array fa1 
    split($2, fa2, ",") # split $2 into subfields by "," and store in array fa2 
    # Output fields of interest 
    print fa1[2], fa1[3], fa2[1], fa2[2] 
    }' removed-apply.log.2016-02-19 

+1

方括號「[]」是一個字符類,所以「[] []」表示要麼[或]可以匹配...我沒有弄清楚,直到我檢查了正則表達式語法... tks for你的回覆 !它拯救了我〜:D – JasonHuang

+0

@JasonHuang:是的,'[] []'看起來很古怪;很高興你想出來了。還請注意我添加的更簡單的解決方案。 – mklement0

1

使用「]」作爲RS似乎是朝着錯誤方向邁出的一步。 (你會如何區分由「[abc]」組成的輸入文件和由「[abc]」組成的輸入文件之間的區別?

假設您想要的文本位於同一行中的方括號之間,能夠處理您描述的輸入類型:

grep '\[.*\]' | sed -e 's/^[^[]*\[\(.*\)\].*/\1/' 

您可能需要根據需求的細節來調整它。將它翻譯成awk也很容易。

如果您的要求比上面的要複雜得多,請詳細說明。