web-dev-qa-db-fra.com

queue -f, mais avec des nombres de ligne

J'essaie de voir combien de fois foo bar apparaît dans /var/log/foo.log Dans un délai arbitraire sur un serveur distant, mais rien que j'ai essayé jusqu'à présent a fonctionné.

J'ai déjà reçu un script de minuterie que j'utilise pour garder une trace de combien de temps cela a été depuis que j'ai commencé à atteindre /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é google, mais je n'ai rien trouvé de pertinence dans les 10 premières pages des 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 tail -f, mais j'ai fait une tête limitée à cela.

NOTE

le serveur distant exécute une version plus ancienne de Coreutils et la mise à niveau est une option, mais est NON de quelque manière que la solution souhaitée.

23
Alexej Magura
tail -f | nl

fonctionne pour moi et est la première ce que j'ai pensé de - c'est si vous voulez vraiment les lignes numérotées à partir de 1 et non avec le numéro de ligne réel du fichier regardé. Ajouter éventuellement grep si nécessaire au lieu approprié (avant ou après nl). Cependant, rappelez-vous que la tampon peut se produire. Dans mon cas particulier, grep a le --line-buffered Option, mais nl tampons Il est sorti et ne dispose pas d'une option pour la désactiver. D'où le tail | nl | grep Combo ne coule pas vraiment bien.

Cela dit,

tail -f | grep -n pattern

travaille pour moi aussi. La numérotation commence à nouveau depuis le début de la "voie" plutôt que du début du fichier journal complet.

30
peterph

Je pense que c'est mieux ..

less -N +F <filepath>
17
Adam Eberlin

Vous pouvez également tuyer la sortie à less, il a une fonction de numéro de ligne, -N qui vous permettrait de faire défiler l'arrière du journal.

$ tail -f /var/log/foo.log | less -N

Exemple

  1 Jan 17 22:11:58 greeneggs fprintd[4323]: ** Message: entering main loop
  2 Jan 17 22:12:01 greeneggs su: (to root) saml on pts/5
  3 Jan 17 22:12:28 greeneggs fprintd[4323]: ** Message: No devices in use, exit
  4 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Git | personal_repo | Checking for remote changes...
  5 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Cmd | personal_repo | git rev-parse HEAD
  6 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Cmd | personal_repo | git ls-remote --heads --exit-code "ssh://[email protected]      
  6 8us.org/home/sam/SparkleShare/personal_repo.git" master
  7 Jan 17 22:12:58 greeneggs gnome-session[1876]: X11 forwarding request failed on channel 1
  8 Jan 17 22:12:58 greeneggs gnome-session[1876]: 22:12:58 | Git | personal_repo | No remote changes, local+remote: 532213be48cce3b93cb177d409faa      
  8 03b71d0cfa5
  9 Jan 17 22:13:35 greeneggs gnome-session[1876]: 22:13:35 | ListenerTcp | Pinging tcp://notifications.sparkleshare.org:443/
 10 Jan 17 22:13:35 greeneggs gnome-session[1876]: 22:13:35 | ListenerTcp | Received pong from tcp://notifications.sparkleshare.org:443/

REMARQUE : Remarque de la sortie. Vous pouvez ou non aimer cette fonctionnalité, mais il faudra de longues lignes et les coupera de manière à ce qu'ils continuent sur la ligne suivante, mais maintiennent toujours le même numéro de ligne correspondant. Je trouve que cette fonctionnalité est inestimable lorsque vous analysez des fichiers journaux larges! Vous pouvez voir l'effet de cette fonctionnalité sur les lignes 6 & 8.

6
slm

À Grep NOUVEA Lignes uniquement dans le fichier journal car ils sont livrés avec leur numéro de ligne, vous pouvez le faire:

{
  initial_lines=$(wc -l)
  tail -n +1 -f | awk -v NR="$initial_lines" '/pattern/{print NR": "$0}'
} < file.log

(avec mawk, vous voudrez ajouter le -Winteractive Option pour empêcher sa tampon entrée (!)).

wc -l lit les lignes qui y étaient déjà là et les comptent (les caractèresWLINE qui signifie qu'il fonctionne toujours même si la dernière ligne n'est pas encore complète), puis nous tail -f le reste (à partir de l'endroit où wc a cessé de lire) et dites awk Quel est le numéro de ligne du premier qu'il voit.

2
Stéphane Chazelas

Si vous vouliez numéroter à partir du début, vous auriez besoin de GREP -N pour appliquer à toutes les lignes.

 tail -f -n100000000 filename.log | grep -n '' 

Si vous ne vouliez que montrer que les 10 derniers, je aurais pensé que vous pourriez repousser le fichier:

 tail -f -n100000000 filename.log | grep -n '' | tail -n10

Le premier est pratique, mais montre trop de production. Je ne sais pas pourquoi le second ne fonctionne pas.

0
Martin Cleaver