Redirigir una salida a un archivo desde el comando piping grep


9

Estoy ejecutando esto:

cat /dev/urandom|hexdump| grep -i "ffff f" > random

y no obtengo nada en el archivo random, sigue siendo de longitud cero después de que se interrumpe el comando.

¿Cómo hacer que escriba la salida en un archivo?

Necesito escribir un resultado en un archivo, que debe contener datos de salida como este:

021bc40 7724 d4f5 59ec bcbb ffff fd26 ab3c 9b7c

03a9100 b3a5 8601 fa33 ffff f23c 4326 2e7f 0c8a

0449810 e459 d5af 4e11 ffff fc55 8660 9efb 3c9b

ingrese la descripción de la imagen aquí

Respuestas:


13

Use la --line-bufferedopción para grep(y también deshacerse de lo inútil cat):

hexdump /dev/urandom | grep --line-buffered -i "ffff f" > random

De esta manera, la salida no se almacena en el búfer, sino que cada línea se coloca randominmediatamente. También recomendaría usar teeen su tubería para ver cuántas líneas se han producido:

hexdump /dev/urandom | grep --line-buffered -i "ffff f" | tee random

3

Su archivo está vacío porque el proceso se interrumpe antes de que el archivo se escriba en el disco. Así es como funciona la redirección. Como solución alternativa, intente esto:

script -c 'cat /dev/urandom|hexdump|grep -i "ffff f"' -f random

Básicamente, esto escribirá todos los resultados de la pantalla en el archivo.


Implicaba un comando más, pero entregado. Gracias.
Ruslan Gerasimov

3

cat /dev/urandom|hexdumpo hexdump /dev/urandomescribe continuamente en el stdout y si presiona Ctrl+ Cno se ejecutará nada después de esto. Pero puedes limitar la salida conhead

hexdump /dev/urandom | head -n1000000 | grep "ffff f" > random  

esto aparecerá grepen las primeras 1000000 líneas de la salida y escribe el resultado en un archivo.


Implicó un comando más, pero dio un buen resultado. Gracias.
Ruslan Gerasimov

1

Deberá escribir la salida de cat /dev/urandom | hexdumpun archivo antes de ejecutarlo la próxima vez. El siguiente script debe lograr lo que está intentando:

cat /dev/urandom | hexdump |
  while IFS= read -r line; do
    printf '%s\n' "$line" >> random;
  done

IFS se usa para dividir la salida en líneas aquí.


(Fuente)


grep "ffff f"perdido
Ruslan Gerasimov
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.