获取多个目录下所有出现的字符串的组合计数?

c0d*_*eek 3 grep bash

我有一个(希望如此)有趣的问题,我可以使用一些建议。我有一个主要用于存储日志的系统。它的目录结构类似于:

YYYY/MM/DD/hostname/
Run Code Online (Sandbox Code Playgroud)

有许多主机名,每个主机名下都有一堆压缩的每小时日志(访问、错误等)。

我感兴趣的是访问日志中按日期和主机名细分的给定字符串的总数。做到这一点的最佳方法是什么?这是否可以通过 find 和 grep 组合实现,或者是否太复杂而需要脚本?

Sté*_*las 6

for d in */*/*/*; do
  printf '%s: ' "$d"
  zcat -- "$d/"*.gz | grep -Fc STRING
done
Run Code Online (Sandbox Code Playgroud)

将计算包含 STRING 的行数。

替换grep -Fc STRINGgrep -Fo STRING | wc -l(假设为 GNU grep)以获得出现次数。

如果您不支持文件,请替换zcat为。gzip -dczcat.gz

使用zsh和 GNU grep,您可以将其缩短为:

for d (*/*/*/*) zcat $d/*.gz | grep -FcH --label=$d STRING
Run Code Online (Sandbox Code Playgroud)