使用grep / awk从文件

时间:2017-04-20 19:34:37

标签: awk grep

我有一个文件有多行以下模式 -

服务器文件 -

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的多次迭代,但到目前为止还没有找到一种只提取服务器名称的方法。例如,“grep -o'到。* abc.net'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的最后一行。净。

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 =&gt; PCRE - perl regexps,\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部分。