我需要计算日志中的一些模式,我可以使用
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
如果你想分别计算aaa
和bbb
,请查看 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