web-dev-qa-db-fra.com

grep et queue -f?

Est-il possible de faire un tail -f (ou similaire) sur un fichier et grep il en même temps? Je ne me dérangerais pas d'autres commandes que de rechercher ce genre de comportement.

30
xenoterracide

En utilisant =GNU tail et GNU grep, je suis capable de grep a tail -f Utilisation de la syntaxe directe:

tail -f /var/log/file.log | grep search_term
48
Steven D

Ajouter --line-buffered à grep, et cela peut réduire le retard pour vous. Très utile dans certains cas.

tail -f foo | grep --line-buffered bar
7
Digit

Cela fonctionnera bien; Plus généralement, grep _ _ va attendre lorsqu'un programme n'est pas émettant et continue à lire car la sortie est disponible, donc si vous le faites:

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

Rien ne se passera pendant 5 secondes, puis Grep émettra le "test" correspondant, puis cinq secondes plus tard, il quittera la sortie du processus de canalisation.

7
Michael Mrozek

Vous pouvez simplement tuyer la sortie de grep dans tail -f . Il existe également des programmes combinant tail -f Fonctionnalité avec filtrage et colorant, en particulier multiditail ( exemples ).

Je vois toutes ces personnes qui disent à utiliser tail -f, mais je n'aime pas les limites de cela! Ma méthode préférée de rechercher un fichier tout en regardant de nouvelles lignes (par exemple, je travaille couramment avec les fichiers journaux auxquels sont ajoutés la sortie redirigée des processus exécutés périodiquement via des travaux cron) est:

 tail -Fn+0 /path/to/file|grep searchterm

Cela suppose GNU Tail and Grep. Soutenir les détails de la queue (GNU Coreutils, la mine est V8.22) [ https://www.gnu.org/software/ CARUTILS/Manual/CARUTILILS.HTML] :

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

Donc, la partie queue de ma commande équivaut à tail --follow --retry --lines=+0, où l'argument final le dirige pour commencer au début, sautant zéro lignes.

2
wajiii
tail -f access | awk '/ADD/{print $0}'

Utilisez ce qui précède, je l'utilise habituellement.

1
user4553

Vous pouvez utiliser NetCat vers Grep les résultats de la queue -f, car de nouveaux résultats sont assez facilement.

Sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

Cela définit Grep pour écouter des résultats pour les entrées provenant du port 1337.
La deuxième commande conduite la sortie de la queue -f à NetCat et l'envoie localhost 1337. Pour le faire localement, vous devez basculer des tyranes pour chacun des deux séries de commandes ou utilisez quelque chose comme l'écran.

0
Justin S