tail un fichier journal mais affiche uniquement des lignes spécifiques

23

Je file un fichier journal avec l'option -f. Ensuite, je passe à ceci pour trouver uniquement les lignes contenant "X". Cela fonctionne parfaitement bien. Maintenant, je veux rediriger ceci dans un autre grep, qui enlèvera toutes les lignes contenant "Y". Lorsque j'ajoute le second canal, le fichier cesse de se rafraîchir et il semble qu'aucune donnée ne soit reçue.

Ceci est la commande qui fonctionne: tail -f my_file.log | grep "X"

Ceci est la commande qui ne fait pas: tail -f my_file.log | grep "X" | grep -v "Y"

Comment dois-je structurer cela pour que la commande fonctionne?

    
posée Ori Horev 13.10.2015 - 15:10
la source

3 réponses

30

Comme la sortie de grep est mise en mémoire tampon, utilisez l'option --line-buffered de grep pour activer la mise en tampon de ligne:

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

Si votre grep n’a pas l’option, vous pouvez utiliser stdbuf comme alternative:

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'
    
réponse donnée heemayl 13.10.2015 - 15:28
la source
17

Je trouve normalement plus utile awk pour ce genre de vérifications logiques:

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

Testé en ayant deux onglets, l’un dans lequel je continue à écrire seq 20 >> myfile et l’autre avec par exemple tail -f myfile | awk '/3/ && !/13/' .

    
réponse donnée fedorqui 13.10.2015 - 16:42
la source
15

Une autre approche consisterait à utiliser une seule invocation grep au lieu de deux et éviter ainsi le problème de mise en mémoire tampon. Utilisez simplement des expressions régulières qui correspondent à des lignes composées d'au moins 0 caractères non-Y, puis un X, puis 0 ou plus de non-Y jusqu'à la fin de la ligne "

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
    
réponse donnée terdon 13.10.2015 - 16:36
la source

Lire d'autres questions sur les étiquettes