2017-04-20 70 views
0

我有具有以下模式的多行文件 -使用grep/awk来从文件中提取的服务器名称

Serverfile -

permit from www.hadooptest.abc.net to www.ha1.abc.net:80/TCP, 443/TCP 

permit from www.hadooptest.abc.net to www.apz2.abc.net:443/TCP 

permit from www.hadooptest.abc.net to www.aln.abc.net, www.klm.abc.net:80/TCP, 443/TCP 

我想拿出一个脚本提取文件中的所有服务器名称。我玩过多次的grep和awk迭代,但到目前为止还没有找到一种方法来只提取服务器名称。例如,“‘为* abc.net’grep的-o Serverfile”给我下面的输出 -

$ grep -o ' to.*abc.net' Serverfile 
to www.ha1.abc.net 
to www.apz2.abc.net 
to www.aln.abc.net, www.klm.abc.net 

我不能在脚本中使用这个作为不被提取,并在个别服务器名称有一些行与多个服务器名称,如最后一个与www.aln.abc.net和www.klm.abc.net。

谢谢!

+1

这是什么问题,为了避免从输出中将子字符留给子字符串? – RomanPerekhrest

回答

0

你grep的解决方案是好的,但返回两个结果:

$ grep -o '[A-Za-z0-9_\.-]*.abc.net' <<<"permit from www.hadooptest.abc.net to www.ha1.abc.net:80/TCP, 443/TCP" 
www.hadooptest.abc.net #You don't want this one 
www.ha1.abc.net 

我会使用类似:

$ grep -Po 'to \K[A-Za-z0-9_\.-]*.abc.net' <<<"permit from www.hadooptest.abc.net to www.ha1.abc.net:80/TCP, 443/TCP" 
www.ha1.abc.net 

或者只是$ grep -Po 'to \Kwww[.].*.abc.net'

这将使用grep -Po => PCRE - Perl的正则表达式,与\K运算符(=忘记以前)

甚至可以使用另一种工具:

$ sed -r 's/(.*to)([A-Za-z0-9_\.-]*.abc.net)(.*)/\2/g' <<<"permit from www.hadooptest.abc.net to www.ha1.abc.net:80/TCP, 443/TCP" 
www.ha1.abc.net 

或者只是$ sed -r 's/(.*to)(www[.].*.abc.net)(.*)/\2/g'

只需更换部分<<<"..."结尾yourfile

+0

谢谢!这是更加优雅! – user168115

+0

@ user168115欢迎。如果您对这些解决方案感到满意,您可以通过点击绿色勾号来接受答案。 –

0

好吧......我可能已经找到了答案:) -

grep -o '[A-Za-z0-9_\.-]*.abc.net' Serverfile | more 
www.hadooptest.abc.net 
www.ha1.abc.net 
www.hadooptest.abc.net 
www.apz2.abc.net 
www.hadooptest.abc.net 
www.aln.abc.net 
www.klm.abc.net 
相关问题