grep 尋找分隔符號中模式之後的內容

grep 尋找分隔符號中模式之後的內容

說我有一個文件

#cat file.log
abc|123|text1 modesc=bpp123 raw_info=clear
abc|123|text2 modesc=pmk123 severity=minor
abc|123|text3 modesc=pnj123 info=good

只想知道 print $3 中的哪些單字出現在「modesc=」之後直到空格,

我更希望該命令的輸出如下所示:

abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

使用 bash,我想列印出 $3 剛剛得到“modesc=”之後的單字。有沒有辦法做到這一點?

答案1

$ sed 's/[^|]*modesc=\([^ ]*\).*$/\1/' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

這用於將整個最後一個欄位替換為下一個空格sed之後的內容。modesc=


$ awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3)} 1' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

awk程式透過兩次替換修改第三列。第一個刪除所有直到(包括)的內容modesc=,第二個刪除第一個剩餘空間之後的所有內容。1末尾的單獨的將導致awk列印修改的記錄(這可以被替換{ print })。


僅有的從原始資料的第三列(而不是其他任何內容)獲取後面的字串modesc=,您可以使用上述命令之一,然後透過管道將其傳輸cut -d '|' -f3,或者您可以使用

sed 's/.*modesc=\([^ ]*\).*$/\1/' file

或者

awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3); print $3 }' file

答案2

awk可以使用多個分隔符號並使其非常簡單:

awk -F'[|= ]' ' {print $1"|" $2"|" $5}' /tmp/file.log

在上面的管道中|,等價符號=和空格 是分隔符號。

您可以像這樣明確定義輸出分隔符號:

awk -F'[|= ]' 'BEGIN { OFS="|"}  {print $1,$2,$5}' /tmp/file.log

答案3

使用awk

awk -F\| '{print $1"|"$2"|"gensub(/modesc=(.*) .*$/,"\\1","g",$3)}' /tmp/file.log

答案4

這會降低效率,但該任務非常適合cut併且paste

paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')

相關內容