Comment suivre / grep / awk les N derniers octets d'un fichier, plutôt que les lignes

13

J'ai une application qui se connecte à un fichier journal en texte brut (myapp.log) mais il ne semble pas écrire de nouveaux caractères de ligne à la fin de chaque entrée de journal. Si j'exécute une commande comme tail -n 50 myapp.logje reçois en fait des centaines de "lignes" de texte (entrées de journal).

Ce fichier journal est très volumineux, environ 1 Go, qui sait depuis combien de temps le dernier CR et / ou LF a été inséré. Comment puis-je simplement saisir les derniers 2 Mo par exemple?

jwbensley
la source

Réponses:

26

Utilisation du -ccommutateur (2 Mo = 2 * 1024 * 1024 = 2097152 octets):

tail -c 2097152 myapp.log

Merci à Petr Uzel pour la suggestion. Certaines implémentations de queue permettent d'ajouter une unité pour imprimer les derniers kilo-octets (k) ou mégaoctets (m), comme:

tail -c 2m myapp.log

Cependant, veuillez noter qu'il n'est pas standard (dans aucun POSIX, UNIX (SUS) ou Linux (LSB)) et n'est pas portable. Notez également que puisque les termes "Mega" / "kilo" ... et leurs abréviations (M, k ...) ont des significations ambiguës (1000 vs 1024), il n'y a pas beaucoup de garantie de ce que telle ou telle implémentation tailsignifiera par 2m(bien que les versions actuelles des implémentations actuelles qui le prennent en charge semblent aller pour la variante 1024).

Birei
la source
5
Tail devrait pouvoir accepter un nombre avec des unités comme argument pour le commutateur c, donc tail -c 2M myapp.logdevrait également fonctionner.
Petr Uzel,
@PetrUzel: Merci. Modifié la réponse pour l'ajouter.
Birei
Maintenant, je me sens bête :) Merci pour la rapidité, apprécie vraiment cela. Grande suggestion!
jwbensley
1
Parfait, je ne sais pas si cela vous aidera, mais je vais ajouter cette chaîne de texte car c'est ce que j'étais les mots-clés que je cherchais pour arriver ici (a pris un bon moment): "données de fichier de chat entre deux positions d'octets (pas de lignes) "
Torxed le