J'ai un problème (j'espère) intéressant que je pourrais utiliser quelques conseils sur. J'ai un système qui est essentiellement utilisé pour stocker les journaux. Il a une structure de directory comme:
YYYY/MM/DD/hostname/
Il y a un certain nombre de noms d'hôtes, et sous chacun sont un tas de journaux horaires gzipped (access, erreur, etc.).
Ce qui m'intéresse, c'est le nombre total d'une string donnée dans les journaux d'access ventilés par jour et par nom d'hôte. Quelle est la meilleure façon de faire cela? Est-ce possible avec une combinaison find et grep, ou est-ce trop compliqué pour cela et a besoin d'un script?
for d in */*/*/*; do printf '%s: ' "$d" zcat -- "$d/"*.gz | grep -Fc STRING done
countrait le nombre de lignes contenant STRING.
Remplacer grep -Fc STRING
avec grep -Fo STRING | wc -l
grep -Fo STRING | wc -l
(en supposant que GNU grep
) ait le nombre d'occurrences.
Remplacez zcat
par gzip -dc
si votre zcat
ne supporte pas les files .gz
.
Avec zsh
et GNU grep
, vous pouvez le raccourcir à:
for d (*/*/*/*) zcat $d/*.gz | grep -FcH --label=$d STRING
Si vous voulez faire cela sans un parsingur de journal standard, vous pouvez le faire dans une "ligne unique" de shell depuis le directory contenant vos directorys YYYY:
for d in */*/*; do echo -n "$d : " find $d -name *.log | xargs grep -c STRING done