[英]Extract all the occurrences of strings enclosed between < & > in ubuntu bash
在 tomcat 訪問日志文件中,除了默認的 patternLayout(即 common)之外,我們在<
& >
字符內的每一行中還有 3 個附加字段(請求標頭)。
模式: ... <AJsonString> <User-Agent> <ReferrerURL>
示例日志:
<{'id':'uuid'}> <Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36> \<https://someurl\>
<-> <Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36> <->
要求:
我需要提取<
& >
字符之間的字符串,例如subStr1 = AJsonString
、 subStr2 = User-Agent
& subStr3 = ReferrerURL
。 如何在 ubuntu bash 中實現這一點?
從每個訪問日志行中,我可以使用grep -o '<.*>'
提取上述示例數據我應該做什么? 我正在使用“GNU bash,版本 4.3.48(1)-release (x86_64-pc-linux-gnu)”
或者是否有任何替代方法可以以最簡單/更好的方式完成整個過程?
我是腳本和任何建議的新手,指針會很有幫助。
謝謝你的時間:)
考慮到這是您的行(不使用管道|
):
LINE="<{'id':'uuid'}> <Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36> <https://someurl>"
你可以使用這個:
IFS='|' read json ua url <<<$(echo $LINE|perl -ne 'm{<([^>]+)>\s*<([^>]+)>\s*<([^>]+)>}; print "$1|$2|$3"')
現在變量json , ua和url將有數據:
$ echo $json
{'id':'uuid'}
$ echo $ua
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
$ echo $url
https://someurl
這個怎么運作:
echo $LINE|perl -ne 'm{<([^>]+)>\s*<([^>]+)>\s*<([^>]+)>}; print "$1|$2|$3"'
這將使用-n
選項執行 perl ,這會創建一個隱式循環來讀取分配給主題/默認變量$_的 arguments。 然后你對那個變量執行這個正則表達式:
<([^>]+)>\s*
< # a literal '<'
( # start of capturing group
[^>]+ # a character that cannot be '>' one or more times
) # end of capturin group (this particular group will be saved to $2)
> # a literal '>'
\s* # any whitespace-like character 0 or more times
<([^>]+)>
數據在變量$1 、 $2和$3中捕獲,這些變量隨后在相同的 perl 腳本中打印,由管道分隔( print "$1|$2|$3"
)
這被輸入( <<<$(somecommand)
)到讀取命令,它將數據分配給變量。 在此之前,我們將字段分隔符變量更改為使用管道 ( IFS='|'
),因為默認值是空格。
注1:
如果您的線路可以有管道,您應該同時更改IFS和 perl 腳本以使用另一個字符
筆記2:
您的第一個示例行有一些帶有反斜杠的<和> 。 第二個例子沒有。 在我的回答中,我認為這些反斜杠不存在。 如果您可以擁有它們,則應該更改正則表達式。 將\s*
更改為[\s\\]*
應該可以工作
注3:
這是使用sed
而不是perl
的另一種選擇:
LINE="<{'id':'uuid'}> <Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36> <https://someurl>"
IFS='|' read json ua url <<<$(echo $LINE|sed -E "s/>[ \\]*</|/g"|sed -E "s/^[ \\<]+|[ \\>]+$//g")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.