簡體   English   中英

僅顯示特定的正則表達式組並使用 sed 刪除 bash 中的其余行

[英]Show just specific group of regexp and remove rest of the line in bash with sed

我有一個多行的訪問日志,格式如下:

1.2.3.4:443  - - [11/Mar/2020:09:41:05 +0100] RESPONSE_CODE:[200] AGE: [-] CACHE_MISS: [-] CACHE-STATUS: [-] SIZE: [1288] RESPONSE_TIME: [2/2125012] (microseconds) WAS:[was.internal:9444] "PUT /kudosboards/node/a8740540-801a-43a6-822a-d58a2424fd3f HTTP/1.1" 200 REFERER: "https://ihs.internal/kudosboards/"

我只想得到響應時間,所以在這個例子中2/2125012 我的想法是編寫一個正則表達式模式,匹配組中的括號內容,以及其他組中它之后/之前的所有內容。 所以我可以用這個值替換整行:

^(.*)RESPONSE_TIME: \[([^\]]+)(.*)$

101regex與示例輸入字符串一起使用,它按預期將我 `` 作為第二組:

Group 2 2/2125012

為了將這種模式與egrep ,我像這樣對括號進行了轉義:

$ sed 's#^\(.*\)RESPONSE_TIME: \[\([\^\]]+\)\(.*\)$#\2#g' testfile
1.2.3.4:443  - - [11/Mar/2020:09:41:05 +0100] RESPONSE_CODE:[200] AGE: [-] CACHE_MISS: [-] CACHE-STATUS: [-] SIZE: [1288] RESPONSE_TIME: [2/2125012] (microseconds) WAS:[was.internal:9444] "PUT /kudosboards/node/a8740540-801a-43a6-822a-d58a2424fd3f HTTP/1.1" 200 REFERER: "https://ihs.internal/kudosboards/"

為什么什么都沒有更換? 我逃脫了([ .

這似乎與方括號有關:

$ sed 's#^\(.*\)RESPONSE_TIME: \[\(.*\)\] (micro\(.*\)$#\2#g' testfile
2/2125012

這奏效了。 但是那些模式不是很具體。 我想讓它更具體,例如在括號內使用[0-9]+/[0-9]+代替(.*)通配符模式。

您的模式包含與使用 POSIX BRE/ERE 相關的問題: [\\^\\]]+匹配一個字符,即^] ,然后是一個+字符( demo )。 您需要在 GNU sed使用* (匹配0 次或多次出現)而不是+\\+ ,或在通用 POSIX BRE 中使用\\{1,\\}

您可以使用以下命令修復sed命令

sed -n 's#.*RESPONSE_TIME: \[\([^]]*\).*#\1#p' testfile

請參閱在線sed演示

細節

  • -n抑制默認行輸出
  • .*RESPONSE_TIME: \\[\\([^]]*\\).* - 匹配任何 0+ 個字符、 RESPONSE_TIME: 、空格、 [ ,然后將除]以外的任何零個或多個字符捕獲到組 1 中,然后匹配其余字符字符串的
  • \\1 - 用組 1 值替換匹配
  • p - 打印替換的結果。
$ awk -F'[][]' '{print $14}' file
2/2125012

如果這不是您所需要的全部,那么編輯您的問題以提供更真實具有代表性的樣本輸入/輸出,包括上述不適用的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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