Est-il possible de faire un tail -f
(ou similaire) sur un fichier, et grep
ce en même temps? Cela ne me dérangerait pas que d'autres commandes recherchent simplement ce genre de comportement.
Est-il possible de faire un tail -f
(ou similaire) sur un fichier, et grep
ce en même temps? Cela ne me dérangerait pas que d'autres commandes recherchent simplement ce genre de comportement.
Réponses:
En utilisant GNU tail
et GNU grep
, je suis capable de faire un grep en tail -f
utilisant la syntaxe directe:
tail -f /var/log/file.log | grep search_term
Cela fonctionnera bien; plus généralement, grep
attendra lorsqu'un programme ne sort pas, et continuera à lire à mesure que la sortie arrive, donc si vous le faites:
$ (echo foo; sleep 5; echo test; sleep 5) | grep test
Rien ne se passera pendant 5 secondes, puis grep affichera le "test" correspondant, puis cinq secondes plus tard, il se terminera lorsque le processus canalisé
Ajoutez --line-buffered
à grep
, et cela peut réduire le délai pour vous. Très utile dans certains cas.
tail -f foo | grep --line-buffered bar
grep
ne va pas à un terminal (redirigée vers un autre type de fichier). la mise en mémoire tampon de ligne est la valeur par défaut lorsque la sortie est envoyée à un terminal, donc cela n'y fera aucune différence. Notez que cette option est spécifique à GNU.
Vous pouvez simplement diriger la sortie de grep
danstail -f
. Il existe également des programmes qui combinent la tail -f
fonctionnalité avec le filtrage et la coloration, en particulier le multitail ( exemples ).
Je vois tous ces gens dire d'utiliser tail -f
, mais je n'aime pas les limites de cela! Ma méthode préférée de recherche d'un fichier tout en surveillant les nouvelles lignes (par exemple, je travaille généralement avec des fichiers journaux auxquels sont ajoutés la sortie redirigée de processus exécutés périodiquement via des tâches cron) est:
tail -Fn+0 /path/to/file|grep searchterm
Cela suppose GNU tail et grep. Détails de support de la page de manuel de queue (GNU coreutils, le mien est v8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.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.
Ainsi, la partie de queue de ma commande équivaut à tail --follow --retry --lines=+0
, où l'argument final lui ordonne de commencer au début, en sautant zéro ligne.
tail -f access | awk '/ADD/{print $0}'
Utilisez ce qui précède, je l'utilise habituellement.
Vous pouvez utiliser netcat pour récupérer les résultats de tail -f car les nouveaux résultats arrivent 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 les résultats des entrées provenant du port 1337.
La deuxième commande dirige la sortie de tail -f vers netcat et l'envoie localhost 1337. Pour le faire localement, vous devez changer ttys pour chacun des deux ensembles de commandes ou utilisez quelque chose comme un écran.
Ça marche. Mais attention à ce que la sortie ne soit plus instantanée: elle est tamponnée à travers le tube.
tail -f
dans une fenêtre et tail -f logfile | grep pattern
dans l'autre fenêtre. Les lignes contenant pattern
n'apparaissent pas toujours dans les deux fenêtres en même temps. J'ai vu des lignes apparaître à 30 secondes d'intervalle en de rares occasions, ce qui était ennuyeux.
tee
ou quelque chose.