2012-07-26 35 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