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.
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.
Je pense que c'est mieux ..
less -N +F <filepath>
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
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.
À 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.
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.