簡體   English   中英

在awk命令中應將“ RS”設置為什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM