2012-07-26 34 views
0

我有以下字符串的文本文件,每一個單獨的行我怎樣才能egrep命令這表達

Host: 22.44.55.33 (x.y.z) Status: Up 

什麼,我需要從線提取是括號x.y.z之間的字符串。

我該如何在Linux中使用grep來做到這一點?

回答

2

您需要sed而不是egrep - sed可以編輯文本,而egrep只能選擇文本行並不改變打印。事情是這樣的:

sed -e 's/^Host:.*(\([^)]*\)).*$/\1/' < inputfile.txt 
4
echo "Host: 22.44.55.33 (x.y.z) Status: Up" | egrep -o "\([^)]*\)" 
(x.y.z) 

重新\([^)]*\)意味着你需要(,那麼除了)然後)任何符號。 grep-o鍵表示grep需要僅打印與正則表達式匹配的那部分輸入文本。

如果你想只具有行「主持人:向上」裏,你可以使用斷言:

$ cat 1.txt 
(1.2.3.4) Host: Up 
(5.6.7.8) Host: Down 
(9.1.2.3) Host: Up 

$ grep -oP '\([^)]*\)(?=.*Host: Up)' 1.txt 
(1.2.3.4) 
(9.1.2.3) 

主要這裏的一點是(?=.*Host: Up),指出要在行Host: Up

+0

猜測「Status:Up」部分很重要,@legoscia的sed解決方案會更有用。但我不知道-o選項,所以+1。 – Axel 2012-07-26 13:22:42

+0

阿克塞爾:你什麼意思? – 2012-07-26 13:25:07

+0

好吧,即使沒有在OP的問題中明確說明,這看起來像試圖建立一個「狀態:上」服務器的列表。當像這樣使用egrep時,你必須grep兩次,而用legoscia給出的答案,你可以在一個步驟中得到結果。 – Axel 2012-07-27 06:01:40