我正在尝试过滤一些邮件日志,并且需要从某些并不总是相同的列中获取一些特定信息。该信息可以在每行的不同列上。我总是使用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
感谢您的帮助
答案 0 :(得分:2)
使用regex ~ /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"'