如何使用grep,awk或sed ..来打印基于模式的值?

时间:2016-11-16 03:45:22

标签: bash awk sed grep

输入文件位于下方,

  

192.168.2.4,21 / tcp // ftp ///,23 / tcp // ssh ///

     

192.168.2.5,53 / tcp // dns ///,80 / tcp // http ///

当我把'ftp'作为参数时,输出应为

  

192.168.2.4,21 / TCP // ftp的///

把'ftp ssh',输出应该是

  

192.168.2.4,21 / tcp // ftp ///,23 / tcp // ssh ///

到目前为止,我尝试过awk grep egrep,但结果不合适。

grep:我试过grep -o -e“pattern1”-e“pattern2” 此方法仅使用麻烦的换行符打印出匹配的值。

awk:我试图通过“,”将行拆分为列,而将column2拆分为行尾,只打印匹配的值。 (只是一个想法,在网上找不到任何例子)

谢谢!

3 个答案:

答案 0 :(得分:0)

这段代码可以达到你想要的效果,虽然它不是超级优雅的:

grep -e "ftp" /folder/log | sed 's/ftp\/\/\/.*/ftp\/\/\//'

grep -e "ftp" /folder/log | grep -e "ssh" | sed 's/ssh\/\/\/.*/ssh\/\/\//'

代码假定模式之后的三个正斜杠(///)作为分隔符,因此只要您的模式始终跟在///后它就能正常工作。该代码还假设第二个模式将始终列在该行的第一个模式之后(例如:在这种情况下,您希望ftp始终首先出现在行上而不是ssh)。

答案 1 :(得分:0)

您可以使用cut吗? -

grep "ftp" /your/file | cut -d, -f1-2

答案 2 :(得分:0)

将以下脚本保存在文件中并使用以下命令调用:

awk -v re="http|ssh" -f script input

脚本:

BEGIN{
        FS=","
}
{
        printf "%s", $1;
        for( i=2; i<=NF; i++ )
                if ($i ~ re)
                        printf ",%s",$i;
        printf "\n"
}