la tubería no escribe en el archivo

la tubería no escribe en el archivo

Quiero obtener solo el número de ms de un comando ping a un archivo. Sin canalizar a un archivo, funciona según lo previsto. Estoy un poco perdido en cuanto a por qué > en un archivo no escribe nada.

Esto funciona:

ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g'

Esto no escribe nada en ping.dat.

ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > ping.dat

¿Qué estoy haciendo mal?

Respuesta1

Cada uno |está potencialmente rodeado por un búfer de salida estándar y un búfer de entrada estándar. Debe averiguar cuál de ellos debe desactivar para obtener tuberías en tiempo real.

Esto funciona para mí:

ping localhost |egrep --line-buffered -v 'PING|timeout' |\
stdbuf -o0 sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > file

Al principio puse stdbuf -i0 -o0delante de cada comando y luego descubrí cuáles eran innecesarios.

Respuesta2

Si estás usando GNU, entonces parece que la -lopción sed es incorrecta: probablemente quieras la -uopción (sin búfer). Además, grepes superfluo. Deberías poder obtener lo que quieres solo con sed:

ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out

Suprime -nla salida coincidente normal, mientras que s///pfuerza la salida de líneas coincidentes.

información relacionada