我正在编写一个脚本,该脚本将根据特定字符串在控制台上显示所有结果及其计数。
示例:假设我搜索一个名为“ERROR”的字符串,我得到以下结果,这里 ERROR 出现的次数是 5。
2013-12-08 13:43:07 SUSE::SRPrivate - [error] ERROR: Couldn't connect to server: (7)
2014-01-08 13:43:06 SUSE::SRPrivate - [error] ERROR: Couldn't connect to server: (7)
2014-02-08 13:43:24 SUSE::SRPrivate - [error] ERROR: Timeout was reached: (28)
2014-03-08 13:43:03 SUSE::SRPrivate - [error] ERROR: Couldn't connect to server: (7)
2014-04-08 13:43:24 SUSE::SRPrivate - [error] ERROR: Timeout was reached: (28)
我想显示日志和出现次数(行)。我写了下面的脚本来显示日志:
(zgrep -E "ERROR|Exception" $SS_HOME/logs/*.gz $PROBE_HOME/logs/*.gz $RELAY_HOME/logs/*.gz ;find . -type f -name "*.log" -exec cat {} +) | grep -F ERROR | sort
我不知道如何添加行数。如需任何其他信息,请告知我。
答案1
要显示匹配的行,请对它们进行计数,并使用以下命令显示计数awk
:
awk '/ERROR/{err++; print} END{print "errors:", err}'
总结错误和异常:
awk '/ERROR/||/Exception/{faults++; print} END{print "faults:", faults}'
分别计算错误和异常:
awk '/ERROR/{err++; print} /Exception/{exc++; print}
END{print "errors:", err, "exceptions:", exc}'
注意:awk 程序充当过滤器,它们从标准输入读取并写入标准输出,但您也可以提供数据文件作为参数。因此,要使用的是(如下面的评论中所要求的)与一个或多个日志文件 use awk '...' *.log
,或者如果您希望在使用 use 解析它们之前解压缩一个或多个 gz 文件awk
,例如zcat *.gz | awk '...'
(您将上述任何awk
程序替换为awk '...'
)。
答案2
只需使用wc
带有选项的命令-l
:
wc -l
如果您也想打印日志,那么您可以使用tee
:
cat logs.txt | grep -i error | tee >(wc -l)