我有一个(希望)有趣的问题,我可以提供一些建议。我有一个主要用于存储日志的系统。它的目录结构如下:
YYYY/MM/DD/hostname/
有许多主机名,每个主机名下面都有一堆压缩的每小时日志(访问、错误等)。
我感兴趣的是访问日志中给定字符串的总数(按日期和主机名细分)。最好的方法是什么?这是否可以通过 find 和 grep 组合来实现,或者是否太复杂而需要一个脚本?
答案1
for d in */*/*/*; do
printf '%s: ' "$d"
zcat -- "$d/"*.gz | grep -Fc STRING
done
会计算包含 STRING 的行数。
替换grep -Fc STRING
为grep -Fo STRING | wc -l
(假设 GNU grep
)以获得出现次数。
如果您不支持文件,请替换zcat
为。gzip -dc
zcat
.gz
使用zsh
GNU grep
,您可以将其缩短为:
for d (*/*/*/*) zcat $d/*.gz | grep -FcH --label=$d STRING
答案2
如果您想在没有标准日志分析器的情况下执行此操作,则可以在包含 YYYY 目录的目录中的 shell 的“单行”中执行此操作:
for d in */*/*; do
echo -n "$d : "
find $d -name *.log | xargs grep -c STRING
done