我有以下字符串的文本文件,每一个单独的行我怎样才能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