簡體   English   中英

使用sed或AWK進行文本處理

[英]Text Manipulation using sed or AWK

對服務運行腳本時,得到以下結果。 結果因服務而異,但下面顯示的文本模式相似。 我的腳本結果分配給var1。 我需要從該變量中提取數據

$var1=HOST1*prod*gem.dot*serviceList : svc1 HOST1*prod*kem.dot*serviceList : svc3, svc4    HOST1*prod*fen.dot*serviceList : svc5, svc6

我需要從$ var1中刪除服務列表的名稱。 因此,最終結果應打印在單獨的行上,如下所示:

svc1 
svc2
svc3
svc4
svc5
svc6

你能幫忙嗎?

問候

使用gnu grep和gnu sed:

grep -oP ': *\K\w+(, \w+)?' <<< "$var1" | sed 's/, /\n/'
svc1
svc3
svc4
svc5
svc6

使用sed和grep:

sed 's/[^ ]* :\|,\|//g' <<< "$var1" | grep -o '[^ ]*'

sed刪除冒號和逗號之前的所有非空白。 Grep只是每行輸出一個結果服務。

grep是完成這項工作的理想工具。

來自man grep

-o,--only-matching
僅打印匹配行的匹配(非空)部分,每個這樣的部分都在單獨的輸出行上。

聽起來很完美!

據我所知,這將適用於任何grep

echo "$var1" | grep -o 'svc[0-9]\+'

匹配“ svc”,后跟一個或多個數字。 您還可以通過-P啟用“高度試驗性”的Perl regexp模式,這意味着您可以使用\\d數字字符類,而不必再使用+

grep -Po 'svc\d+' <<<"$var1"

bash您可以使用<<<此處為String )為標准輸入的grep提供"$var1"


順便說一句,如果您的數據最初位於單獨的行中,例如:

HOST1*prod*gem.dot*serviceList : svc1 
HOST1*prod*kem.dot*serviceList : svc3, svc4    
HOST1*prod*fen.dot*serviceList : svc5, svc6

這對於awk將是一件好工作:

awk -F': ' '{split($2,a,", "); for (i in a) print a[i]}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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