如何使用多个过滤器进行 grep 并一一打印?

如何使用多个过滤器进行 grep 并一一打印?

我需要计算日志中的一些模式,我可以使用

grep aaa ./logs | wc -l

grep bbb ./logs | wc -l

有没有一种简单的方法可以在一行中完成所有事情?喜欢

cat ./logs | grep -c aaa | grep -c bbb #didn't work.

答案1

您可以使用以下命令:

$ grep -oh -e aaa -e bbb ./logs | sort | uniq -c

man grep,您可以读到:

-o, --only-matching 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

另外,对于-h

-h, --no-filename 禁止输出中的文件名前缀。当只有一个文件(或只有标准输入)要搜索时,这是默认设置。

用于-e匹配任一者。然后,使用 来对结果进行排序和计数uniq

答案2

您可以使用该-e PATTERN标志。为了计算有多少行包含任一或两者 aaa或者bbb

grep -e aaa -e bbb ./logs | wc -l

如果你想分别计算aaabbb,请查看 Khaled 的解决方案。

答案3

使用awk

awk '/aaa/ { count["aaa"]++ }
     /bbb/ { count["bbb"]++ }
     END { for (pat in count) print count[pat], pat }'  file

只要模式匹配,这就会更新与匹配模式关联的计数。最后,输出计数列表和相应的模式。

答案4

我尝试使用以下命令

维恩:~$for i in aaa bbb; do perl -pne "s/\n/ /g" i.txt| awk -v i="$i" '{print gsub(i,$0)}';echo $i; done| sed "N;s/\n/ /g"| awk '{print $2,$1}'

输出

维恩:~$for i in aaa bbb; do perl -pne "s/\n/ /g" i.txt| awk -v i="$i" '{print gsub(i,$0)}';echo $i; done| sed "N;s/\n/ /g"| awk '{print $2,$1}'

aaa 1
bbb 2

相关内容