Estoy siguiendo un archivo de registro con la bandera -f. Luego estoy canalizando esto a grep, para encontrar solo líneas que contengan "X". Eso funciona perfectamente bien. Ahora quiero canalizar esto nuevamente en otro grep, que eliminará todas las líneas que contienen "Y". Cuando agrego la segunda tubería, el archivo deja de actualizarse y parece que no llegan datos.
Este es el comando que funciona: tail -f my_file.log | grep "X"
Este es el comando que no: tail -f my_file.log | grep "X" | grep -v "Y"
¿Cómo debo estructurar esto para que el comando funcione?
command-line
grep
Ori Horev
fuente
fuente
tail -f file|grep -v "Y"
. Si la salida está bien, proceda a agregargrep "X"
.Respuestas:
Como la salida de
grep
se almacena en búfer, use la--line-buffered
opción degrep
para habilitar el almacenamiento en línea de la memoria intermedia:Si
grep
no tiene la opción, puede usarstdbuf
como alternativa:fuente
stdbuf
dicelibstdbuf.so
qué configuración usar.diff -u <(env) <(stdbuf env)
y no encontré ninguna. Pero ahora me doy cuenta de que lo que debería haber probado fuediff -u <(env) <(stdbuf -oL env)
.tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb'
no da ningún resultado. Me podría ayudar.Normalmente encuentro más útil
awk
para este tipo de comprobaciones lógicas:Probado por tener dos pestañas, una en la que sigo escribiendo
seq 20 >> myfile
y la otra por ejemplotail -f myfile | awk '/3/ && !/13/'
.fuente
Otro enfoque sería utilizar una sola
grep
invocación en lugar de dos y así evitar el problema del almacenamiento en búfer. Simplemente use expresiones regulares que coincidan con líneas que consisten en 0 o más caracteres que no sean Y, luego una X y luego 0 o más que no sean Y nuevamente hasta el final de la línea "fuente