使用awk

时间:2018-08-29 20:39:12

标签: logging awk

我正在尝试过滤一些邮件日志,并且需要从某些并不总是相同的列中获取一些特定信息。该信息可以在每行的不同列上。我总是使用awk只打印我想要的列,例如:

cat file.log | awk '{print $1" "$2" "$3}' >> output.txt

但是在这种情况下,我不知道哪一列包含我要查找的字符串。

在file.log示例中,我正在寻找包含字符串“ 5”的列:

A B C 222 586 999 724 644  
A B C 510 333 987 678 633  
A B C 348 488 920 566 240  

我想要的结果:

A B C 586  
A B C 510  
A B C 566  

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

使用 ~ /5/并在每行/每行的每一列上进行迭代(KISS):

$ awk '
    {
        for (i=1; i<=NF; i++) {
            if (i==1 || i==2 || i==3 || $i ~ /5/) {
                printf "%s ", $i
            }
         }
         print ""
    }
' file

输出:

A B C 586 
A B C 510 
A B C 566 

答案 1 :(得分:1)

$ awk '{
    for(i=4;i<=NF;i++)    # iterate fields starting from the 4th
        if($i~/5/)        # if there is a 5 in the field
            $3=$3 OFS $i  # append field value to the 3rd field
    print $1,$2,$3        # output 1st thru 3rd
}' file

Output:

A B C 586
A B C 510
A B C 566

答案 2 :(得分:1)

一个棘手的perl内衬

perl -anE 'say "@{[ @F[0..2], grep {/5/} @F[3..$#F] ]}"' file

其中

  • -n逐行遍历输入文件
  • -a将每一行分成单词,然后存储到@F数组中
  • @F[0..2]是前3个字; @F[3..$#F]是第4个到最后一个单词的列表
  • grep {/5/}过滤列表,仅返回包含“ 5”的单词
  • "@{[ ... ]}"是一种语法技巧,用于将列表字符串化为以空格分隔。

也可以使用它,虽然很棘手,但是“ syntax-y”要少一些

perl -anE 'push @F, grep {/5/} splice @F,3; say "@F"'