[英]What should 'RS' be set to in this awk command
我正在使用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
仍然是換行符。
更新 :關於第二個想法,你可以逃脫一個單一的輸入場分離器的正則表達式(通過選項指定-F
,轉化為可變FS
):
awk -F ',\\[?|\\]' '{ print $2 ,$3, $6 ,$7 }' removed-apply.log.2016-02-19
請注意,需要對\\
實例加倍以在正則表達式的上下文中產生跟在其后的字符作為文字 。 例如, awk
的初始字符串解析將\\\\[
轉換為文字\\[
,然后將正則表達式解析視為\\[
,從而將其解釋為文字 [
。 簡而言之: string ,\\\\[?|\\\\]
正則表達式 ,\\[?|\\]
。
原始答案 (接受):
您的輸入仍然明確地是面向行的 ,因此沒有理由更改輸入記錄分隔符RS
。
相反,分析每一行分兩個步驟:
FS
首先將輸入分為2個字段: [
之前和之間[...]
。
[][]
看起來很奇怪,它是一個字符集( [...]
),它包含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
將“]”用作RS似乎是朝錯誤方向邁出的一步。 (如何區分由“ [abc]”組成的輸入文件和由“ [abc]組成的輸入文件”之間的區別?)
假設您想要的文本在同一行的方括號之間,則以下內容將能夠處理您描述的輸入類型:
grep '\[.*\]' | sed -e 's/^[^[]*\[\(.*\)\].*/\1/'
您可能需要根據需求的細節進行調整。 將其轉換為awk也很容易。
如果您的要求比上述要求更復雜,請進行詳細說明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.