Queue de passepoil bien que grep deux fois

Avec un journal d’access Apache typique, vous pouvez exécuter:

tail -f access_log | grep "127.0.0.1" 

Qui vous montrera seulement les journaux (tels qu’ils sont créés) pour l’adresse IP spécifiée.

Mais pourquoi cela échoue-t-il lorsque vous le dirigez bien que grep une seconde fois, pour limiter davantage les résultats?

Par exemple, une simple exclusion pour “.css”:

 tail -f access_log | grep "127.0.0.1" | grep -v ".css" 

ne montrera aucune sortie.

Je crois que le problème ici est que le premier grep met en mémoire tampon la sortie, ce qui signifie que le second grep ne le verra pas tant que le tampon ne sera pas vidé.

Essayez d’append l’option --line-buffered sur votre premier grep:

 tail -f access_log | grep --line-buffered "127.0.0.1" | grep -v ".css" 

Pour plus d’informations, voir “BashFAQ / 009 – Qu’est-ce que la mise en mémoire tampon? Ou pourquoi ma ligne de commande ne produit-elle aucune sortie: tail -f logfile | grep 'foo bar' | awk ...

Ceci est le résultat de la mise en mémoire tampon, il imprimera éventuellement lorsque suffisamment de données sont disponibles.

Utilisez l’option --line-buffered comme suggéré par Shawn Chin ou si stdbuf est disponible, vous pouvez obtenir le même effet avec:

 tail -f access_log | stdbuf -oL grep "127.0.0.1" | grep -v ".css"