我有一个文件有多行以下模式 -
服务器文件 -
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的最后一行。净。
谢谢!
答案 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
部分。