查看 Apache 的日志文件时,发现有很多重复的错误消息。我想找出哪些错误消息最常见,哪些是唯一的。
我想要一个简单的脚本,它可以为我提供不同唯一线条的数量。
我知道 Perl/Python/等等,但我更喜欢使用内置工具,例如cut
/ find
/ grep
/sed
等等。
我可以使用 获取一个简单的条目列表sed
。以下显示了唯一错误消息的列表:
$ sed -e "s/\[.*\]\([^:]*\)\(.*\)/\1/" error.sml.log | sort -u
Apache configured -- resuming normal operations
client denied by server configuration
Digest
File does not exist
request failed
这可以计算发生次数。但它用处不大,因为它没有显示计数与什么相关:
$ sed -e "s/\[.*\]\([^:]*\)\(.*\)/\1/" error.sml.log | sort -u | xargs -I{} grep -oc {} error.sml.log
1
3886
2
6091
20
我希望输出看起来更像这样:
1 Apache configured -- resuming normal operations
3886 client denied by server configuration
2 Digest
6091 File does not exist
20 request failed
答案1
sed -e "s/\[.*\]\([^:]*\)\(.*\)/\1/" error.sml.log | sort | uniq -c 1 Apache 配置--恢复正常运行 3886 服务器配置拒绝客户端 2 摘要 6091 文件不存在 20 请求失败
有一个工具可以做到这一点 uniq。我希望几个小时前就发现它。
有几个有用的选项,例如 uniq -d 仅显示包含多于 1 个条目的行
$ sed -e "s/\[.*\]\([^:]*\)\(.*\)/\1/" error.sml.log | sort | uniq -cd 3886 服务器配置拒绝客户端 2 摘要 6091 文件不存在 20 请求失败
uniq -u 仅显示 uniq 行,仅 1 个条目
$ sed -e “s/\[.*\]\([^:]*\)\(.*\)/\1/” error.sml.log |排序 |唯一标识 Apache 配置 — 恢复正常操作
现在我可以处理十亿行日志文件并了解其中发生的情况。