我有以下字符串的文本文件,每一個單獨的行我怎樣才能egrep命令這表達
Host: 22.44.55.33 (x.y.z) Status: Up
什麼,我需要從線提取是括號x.y.z
之間的字符串。
我該如何在Linux中使用grep來做到這一點?
我有以下字符串的文本文件,每一個單獨的行我怎樣才能egrep命令這表達
Host: 22.44.55.33 (x.y.z) Status: Up
什麼,我需要從線提取是括號x.y.z
之間的字符串。
我該如何在Linux中使用grep來做到這一點?
您需要sed
而不是egrep
- sed
可以編輯文本,而egrep
只能選擇文本行並不改變打印。事情是這樣的:
sed -e 's/^Host:.*(\([^)]*\)).*$/\1/' < inputfile.txt
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
。
猜測「Status:Up」部分很重要,@legoscia的sed解決方案會更有用。但我不知道-o選項,所以+1。 – Axel 2012-07-26 13:22:42
阿克塞爾:你什麼意思? – 2012-07-26 13:25:07
好吧,即使沒有在OP的問題中明確說明,這看起來像試圖建立一個「狀態:上」服務器的列表。當像這樣使用egrep時,你必須grep兩次,而用legoscia給出的答案,你可以在一個步驟中得到結果。 – Axel 2012-07-27 06:01:40