2011-11-01 198 views
2

我想從bash腳本中的一個句子中提取一個單詞。它同時使用了昏迷和空格作爲分隔符。如何從bash shell腳本中的一行中提取一個單詞

ex:- date=crossed 122 name=foo , userid=234567 , sessionid=2233445axdfg5209 associd=2 

我有上面的句子,其中有趣的部分是name = foo。鍵名始終相同,但字符串foo可能會有所不同。其他參數可能也可能不存在。

我需要提取以上的鍵值對。 所以輸出會是:

name=foo 

是什麼做的shell腳本的最佳方式?

謝謝!

+0

有沒有總是空白和一個逗號後的每個「富」鍵?可能「富」鍵包含空格嗎? – ztank1013

回答

1

如果你知道name後的值永遠不會包含空格或引號,並且沒有其他併發症,你可以用sed一行代碼做到這一點:

sed -e 's/^.*\(name=[^ ,]*\).*$/\1/'

這只是說要將整行替換爲與name=匹配的部分,後跟任意數量的非逗號,非空格字符。

如果存在像name="quoted string"name=string\ with\ escaped\ spaces這樣的可能性,這不會非常穩健。但它將適用於有限的情況。

如果你想將結果存儲在一個shell變量,你可以這樣做(在bash)

pair=$(echo $input | sed -e 's/^.*\(name=[^ ,]*\).*$/\1/') 
echo $pair 

它打印name=foo,如預期。

與GNU sed的測試4.2.1和4.2.10猛砸

+0

更新說明您可以通過用'egrep -e'name = [^,] *'-o'替換上面的'sed'命令來更精美地完成同樣的事情,其中​​'-o'表示只打印出來該線的匹配部分。 –

+0

在SuSE11上嘗試過,不知道什麼是bash版本。第一個不顯示輸出,第二個不停地運行,不退出。 – jch

+0

查看Glenn對他的回答的評論(無論如何,這比我的更簡單,更好)。你的輸入來自哪裏 - 一個文件,存儲在一個shell變量或其他東西? –

1

如果「NAME = foo」的始終是該行你可以在同一位置只需使用: awk '{print($3)}',將提取的第三個單詞你的線是name=foo你的情況。

+0

他告訴「其他參數可能也可能不存在」,因此您可能不使用位置邏輯。 – ztank1013

6

的grep這裏是有用的:

grep -o 'name=[^ ,]\+' 
+0

當我運行這個我沒有得到任何輸出... – jch

+1

你需要提供一些輸入。嘗試'grep -o'name = [^,] \ +'<<<「$ sentence」'假設您的問題中的句子存儲在變量「sentence」 –

相關問題