簡體   English   中英

提取 ubuntu bash 中所有出現在 < & > 之間的字符串

[英]Extract all the occurrences of strings enclosed between < & > in ubuntu bash

在 tomcat 訪問日志文件中,除了默認的 patternLayout(即 common)之外,我們在< & >字符內的每一行中還有 3 個附加字段(請求標頭)。

模式: ... <AJsonString> <User-Agent> <ReferrerURL>

示例日志:

  1. <{'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\>
  2. <-> <Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36> <->

要求:

我需要提取< & >字符之間的字符串,例如subStr1 = AJsonStringsubStr2 = 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"')

現在變量jsonuaurl將有數據:

$ 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.

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