J'essaie de voir combien de fois foo bar
apparaît /var/log/foo.log
dans un laps de temps arbitraire sur un serveur distant, mais rien de ce que j'ai essayé jusqu'à présent n'a fonctionné.
J'ai déjà un script de minuterie que j'utilise pour garder une trace de combien de temps il s'est écoulé depuis que j'ai commencé la queue /var/log/foo.log
, et maintenant je voudrais juste un moyen de dire combien de fois foo bar
est apparu dans la sortie queue.
J'ai cherché sur Google, mais je n'ai rien trouvé de pertinent dans les 10 premières pages de résultats.
Voici ce que j'ai essayé avec des résultats frustrants:
## works on local machine, but doesn't work as expected on remote
tail -f /var/log/foo.log | grep foo\ bar | sed '='
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | cat -n -
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | awk -F'\n' '{printf "[%d]> ", NR; print $1}'
J'ai même essayé d'écrire un script sed qui agirait comme ça tail -f
, mais j'ai fait des progrès limités voire nuls avec cela.
REMARQUE
le serveur distant exécute une ancienne version de coreutils, et la mise à niveau est une option, mais pas en aucune façon la solution désirée.
la source
--line-buffered
option pourgrep
. Outail -f ... | awk '/foo bar/{print ++n, $0}'
tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'
Réponses:
fonctionne pour moi et est le premier à quoi j'ai pensé - c'est-à-dire si vous voulez vraiment que les lignes soient numérotées à partir de 1 et non avec le vrai numéro de ligne du fichier regardé. Ajoutez éventuellement
grep
si nécessaire à l'endroit approprié (avant ou aprèsnl
). Cependant, n'oubliez pas que la mise en mémoire tampon peut se produire. Dans mon cas particulier,grep
a l'--line-buffered
option, mais met ennl
mémoire tampon sa sortie et n'a pas d'option pour désactiver cela. Par conséquent, letail | nl | grep
combo ne coule pas vraiment bien.Cela dit,
fonctionne aussi pour moi. La numérotation recommence à partir du début du "tailing" plutôt qu'au début de tout le fichier journal.
la source
-n
option.--line-number
: çatail -f /var/log/foo.log | grep foo\ bar --line-number
marche!Je pense que c'est mieux ..
la source
Vous pouvez également diriger la sortie vers
less
, il a une fonction de numéro de ligne,-N
qui vous permettrait de faire défiler d'avant en arrière dans le journal.Exemple
REMARQUE: prenez note de la sortie. Vous pouvez ou ne pas aimer cette fonctionnalité, mais cela prendra de longues lignes et les hachera pour qu'elles continuent sur la ligne suivante, tout en conservant le même numéro de ligne correspondant. Je trouve cette fonctionnalité inestimable lors de l'analyse de fichiers journaux qui sont larges! Vous pouvez voir l'effet de cette fonction sur les lignes 6 et 8 .
la source
tail
. En ce qui concerne les longues lignes, ce comportement est basculé dans l'less
utilisation-S
.Pour récupérer les nouvelles lignes uniquement dans le fichier journal lorsqu'elles sont fournies avec leur numéro de ligne, vous pouvez faire:
(avec
mawk
, vous voulez ajouter l'-Winteractive
option pour empêcher son entrée (!) mise en mémoire tampon).wc -l
lit les lignes qui étaient déjà là et les compte (les caractères de nouvelle ligne ce qui signifie que cela fonctionne même si la dernière ligne n'est pas encore pleine), puis noustail -f
le reste (à partir de l'endroit où lawc
lecture a été arrêtée) et direawk
quel est le numéro de ligne de le premier qu'il voit.la source
l
comme nom de variable m'a fait plisser les yeux sur $ l, pensant que c'était$1
^^ (mais comme je vous connais (et je vous fais confiance à 100%), j'ai relu et vu la vérité). Juste pour la curiosité: pour éviter une "condition de concurrence" entre lewc -l
et letail -f
(si le fichier se développe rapidement, on peut supprimer certaines lignes et donc le NR commence à partir du mauvais numéro), est-il possible de sauter des$l
lignes à la place? (et quelle est la limite des queues-n
en posix et en gnu?). Peut-être avec un fichier intermédiaire temporaire?tail -n +1
(lire quoi que ce soit depuis la position de départ) répond aux problèmes de condition de course. Il lira les lignes qui n'étaient pas dans le fichier au moment où il s'estwc -l
terminé, à partir de la position exacte qui l'awc
quitté. NR aura donc la bonne position quel que soit le nombre de lignes écrites entre lawc
fin et letail
début. C'est si vous avez dittail
de partir d'une position par rapport à la fin du fichier que vous auriez des problèmes.tail -n +1
ici), pour les fichiers normaux, la plupart des implémentations n'en ont pas car elles peuvent commencer de la finseek
vers l'arrière jusqu'à ce qu'elles trouvent la nième nouvelle ligne sans avoir à stocker plus d'un buf. des données en mémoire. Pour les entrées non recherchables, c'est là que vous pouvez rencontrer des limites. POSIX nécessite des implémentations pour pouvoir stocker au moins 10 x LINE_MAX octets (LINE_MAX étant au moins 2048). La queue GNU n'a pas d'autre limite que la mémoire AFAIKSi vous vouliez numéroter depuis le début, vous auriez besoin de grep -n pour appliquer à toutes les lignes.
Si vous ne souhaitiez afficher que les 10 derniers, j'aurais pensé que vous pouviez retailler le fichier:
Le premier est pratique, mais montre trop de sortie. Je ne sais pas pourquoi le second ne fonctionne pas.
la source
tail -n +1 -f
à la queue depuis le début.tail
ne peut rien produire jusqu'à ce qu'il ait vu la dernière ligne de son entrée (comment pourrait-il savoir quelle est la 10ème dernière ligne?) Qui ne se produiratail -f
jamais car ne s'arrête jamais.La commande
cat -n [filename] | tail
obtiendra un décompte et un affichage rapides des enregistrements les plus récents si c'est ce que vous recherchez.Le
-f
commutateur le rend persistant jusqu'à échapper - ce qui ne semble vraiment pas applicable dans votre scénario ou est redondant.wc -l [filename]
obtiendra un nombre de lignes dans la ciblewc -l [filenameprefix]*
comptera toutes les lignes de tous les fichiers correspondant au modèle et rapportera même un total récapitulatif à la fin.Des détails plus complets peuvent produire des réponses plus complètes.
la source
C'est l'argument
n
ou--lines
(utilisé de manières légèrement différentes, voir ci-dessous):Voir aussi l'aide:
la source