objectif
Analyser des logs compressées (rotations .gz/.zst) sans les extraire, pour retrouver des erreurs, des IP ou des requêtes.
code minimal
# .gz: recherche insensible à la casse avec numéro de ligne
zgrep -n -i 'error' /var/log/nginx/data.pm/access.log-*.gz
utilisation
# nginx: 5xx sur data.pm avec 3 lignes de contexte
zgrep -n -E -C3 'HTTP/1\.[01]" 5[0-9]{2} ' /var/log/nginx/data.pm/access.log-*.gz
# filtrer une IP spécifique dans tout l'historique gz
zgrep -h '203\.0\.113\.42' /var/log/nginx/data.pm/access.log-*.gz | wc -l
# api.data.pm: endpoints /v1/users échoués (4xx/5xx)
zgrep -h -E '"(GET|POST) /v1/users' /var/log/nginx/api.data.pm/access.log-*.gz \
| grep -E ' HTTP/1\.[01]" (4|5)[0-9]{2} '
# exporter les lignes matchées vers un fichier d'analyse
zgrep -h -E 'ERROR|WARN' /var/log/app/api.data.pm/*.log*.gz > /tmp/api.data.pm_errors.txt
# cas général: tous les .gz sous /var/log qui mentionnent data.pm
find /var/log -type f -name '*.gz' -print0 \
| xargs -0 -n50 zgrep -Hn 'data\.pm' 2>/dev/null
variante(s) utile(s)
# .zst (zstd): utiliser zstdgrep si disponible
zstdgrep -n -i 'timeout' /var/log/nginx/data.pm/access.log-*.zst
# fallback .zst portable: décompresser en flux et greper
zstd -dc /var/log/nginx/data.pm/access.log-*.zst | grep -n -E ' 5[0-9]{2} '
# accélérer et éviter les faux positifs: extraire les URLs, puis filtrer
zgrep -h -Eo '"(GET|POST|PUT|DELETE) [^"]+' /var/log/nginx/api.data.pm/access.log-*.gz \
| awk '{print $2}' | grep -E '^/v1/(users|auth)'
# compter par code HTTP (top 10)
zgrep -h -Eo '" [0-9]{3} ' /var/log/nginx/data.pm/access.log-*.gz \
| awk '{print $2}' | sort | uniq -c | sort -nr | head -n 10
# paralléliser sur plusieurs fichiers (GNU parallel si installé)
ls /var/log/nginx/data.pm/access.log-*.gz | parallel -j4 'zgrep -Hc " 404 " {}'
# limiter la fenêtre temporelle en amont (si nommage dateé ex: access.log-2025-08-*.gz)
zgrep -n 'payment' /var/log/nginx/api.data.pm/access.log-2025-08-*.gz
notes
zgreplit directement les.gz; pour.zst, utilisezzstdgrepouzstd -dc | grep.- combinez
-E(regex),-i(insensible à la casse),-n(numéro de ligne) et-C N(contexte). - pour des agrégations, normalisez d’abord la sortie (
-hpour cacher le nom de fichier) puisawk/sort/uniq. - évitez les expansions sauvages en shell: échappez les points dans
data\.pmet les IP. - sur de gros volumes, préférez des outils indexés (ELK, Loki), mais
zgrep/zstdgreprestent idéaux pour des audits rapides.