Linux

Grep 文件中的最後一個匹配項

  • April 18, 2018

我正在對日誌文件執行以下命令,並且只想獲得最後/最新匹配。有時可能只有一個匹配項,有時可能有多個匹配項,這對我來說是個問題,因為以下命令會返回兩個匹配項:

cat "$(ls -t | head -n1)" | grep -P "(NODE1[\s\S]*TEST\s=\sPOWER[\s\S]*OUTPUT\s=\s\d+?.*\s+;?)"

>>>>> (results in)...

NODE1 2018-03-06 12:01:23
 TEST = POWER
 EVENT_TIME = 2018-03-06 12:01:23
 OUTPUT = 12

;

NODE1 2018-03-06 12:03:23
 TEST = POWER
 EVENT_TIME = 2018-03-06 12:03:23
 OUTPUT = 7

;

如果有多個,我需要最後一個匹配組。這是否可以使用 grep/regex 或者我需要將結果通過管道傳輸到 sed/awk 中?如果是這樣,怎麼做?

我向你建議這個解決方案:

cat <your_source_file> | sed -n '/NODE1/,/;/p' | tr '\n' '|' | awk -F ';' '{print $(NF-1)}'|tr '|' '\n'

sed -n '/NODE1/,/;/p'- 找到“NODE1”塊。

tr '\n' '|'將換行符轉換為記錄分隔符,因此表格列將由 ‘;’ 分隔。

awk -F ';' '{print $(NF-1)}'- 列印最後一個表格列。

tr '|' '\n'- 退回到以前的視圖進行記錄。

awk -F ';' '{for(i=(NF-1); i>0; i--){ if($i ~ "TEST = POWER"){print $i} } }'- 只有“TEST = POWER”事件。

根據 Yurij 的建議,我開始研究使用tac而不是 cat,並扭轉我的grep說法。現在,我從下往上查看文件並抓取第一場比賽:

tac "$(ls -t | head -n1)" | grep -m 1 -P "\d+[\s\S]*TEST\s=\sTXPOWER" | tac

引用自:https://serverfault.com/questions/900328