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 -o0
delante de cada comando y luego descubrí cuáles eran innecesarios.
Respuesta2
Si estás usando GNU, entonces parece que la -l
opción sed es incorrecta: probablemente quieras la -u
opción (sin búfer). Además, grep
es 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 -n
la salida coincidente normal, mientras que s///p
fuerza la salida de líneas coincidentes.