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