web-dev-qa-db-fra.com

lire la première ligne du fichier compressé .gz sans décompresser le fichier entier

J'ai un énorme fichier journal compressé au format .gz et je veux simplement en lire la première ligne sans le décompresser pour simplement vérifier la date du plus ancien journal du fichier.

Les journaux sont de la forme:

YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng

Je veux juste lire la date dans la première ligne que je ferais comme ceci pour un fichier non compressé:

read logdate otherstuff < logfile.gz
echo $logdate

L'utilisation de zcat prend trop de temps.

9
Pratik Mayekar

Tuyautage de la sortie de zcat vers head -n 1 décompressera une petite quantité de données, garantie d'être suffisante pour afficher la première ligne, mais généralement pas plus de quelques tampons (96 Ko dans mes expériences):

zcat logfile.gz | head -n 1

Une fois que head a fini de lire une ligne, il ferme son entrée, ce qui ferme le tuyau, et zcat s'arrête après avoir reçu un SIGPIPE (ce qui se produit lors de la prochaine tentative d'écriture dans le tuyau fermé). Vous pouvez le voir en exécutant

(zcat logfile.gz; echo $? >&2) | head -n 1

Cela montrera que zcat se termine avec le code 141, ce qui indique qu'il s'est arrêté à cause d'un SIGPIPE (13 + 128).

Vous pouvez ajouter plus de post-traitement, par exemple avec AWK, pour extraire uniquement la date:

zcat logfile.gz | awk '{ print $1; exit }'

(Sur macOS, vous devrez peut-être utiliser gzcat plutôt que zcat pour gérer les fichiers compressés.)

20
Stephen Kitt

Vous pouvez limiter la quantité de données que vous alimentez à zcat (ou gzip -dc), puis demandez la première ligne:

head -c 1000 logfile.gz | zcat 2>/dev/null | head -1 | read logdate otherstuff

Ajuste le 1000 si cela ne capture pas suffisamment de données pour obtenir la première ligne entière.

4
Jeff Schaller

Pour faire correspondre juste une date de la 1ère ligne d'un fichier compressé - zgrep solution:

zgrep -m1 -o '^[^[:space:]]*' logfile.gz

Cela produira le premier YYYY-MM-DD pour vous.

3
RomanPerekhrest

Si vous voulez juste la première ligne sans décompresser le fichier:

gunzip -c logfile.gz | awk 'NR==1 {print; exit}'

Cela enverra les données compressées vers la sortie standard sans les décompresser et awk n'imprimera que la première ligne.

1
Nasir Riley