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.
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.)
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.
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.
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.