Je suis un fichier journal avec le drapeau -f. Ensuite, je redirige ceci vers grep, pour ne trouver que les lignes qui contiennent "X". Cela fonctionne parfaitement bien. Maintenant, je veux rediriger ceci dans un autre grep, qui supprimera toutes les lignes contenant "Y". Lorsque j'ajoute le deuxième canal, le fichier cesse de se rafraîchir et il semble qu'aucune donnée ne vienne.
C'est la commande qui fonctionne: tail -f my_file.log | grep "X"
C'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?
command-line
grep
Ori Horev
la source
la source
tail -f file|grep -v "Y"
. si la sortie est correcte, passez à l'ajoutgrep "X"
.Réponses:
Comme la sortie de
grep
est mise en mémoire tampon, utilisez l'--line-buffered
option degrep
pour activer la mise en mémoire tampon de ligne:Si votre
grep
n'a pas l'option, vous pouvez utiliserstdbuf
comme alternative:la source
stdbuf
ditlibstdbuf.so
quels paramètres utiliser.diff -u <(env) <(stdbuf env)
et n'en ai trouvé aucune. Mais maintenant je me rends compte que ce que j'aurais dû tester l'étaitdiff -u <(env) <(stdbuf -oL env)
.tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb'
elle ne donne aucune sortie. Pourriez-vous m'aider s'il vous plait.Je trouve normalement plus utile
awk
pour ce genre de vérifications logiques:Testé en ayant deux onglets, l'un dans lequel je continue d'écrire
seq 20 >> myfile
et l'autre ayant par exempletail -f myfile | awk '/3/ && !/13/'
.la source
Une autre approche serait d'utiliser une seule
grep
invocation au lieu de deux et ainsi d'éviter le problème de mise en mémoire tampon. Utilisez simplement une expression régulière qui correspond à des lignes composées de 0 ou plusieurs caractères non Y, puis d'un X puis de 0 ou de plusieurs non Y jusqu'à la fin de la ligne "la source