Reindirizza un output a un file dal comando grep delle tubazioni

9

Sto facendo questo:

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

e non ottengo nulla nel file random , rimane a lunghezza zero dopo che il comando è stato interrotto.

Come farlo scrivere un output su un file?

Ho bisogno di scrivere un risultato in un file, che dovrebbe contenere dati di output come questo:

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

    
posta Ruslan Gerasimov 26.06.2014 - 09:48

4 risposte

12

Utilizza l'opzione --line-buffered per grep (e elimina anche l'inutile cat ):

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

In questo modo l'output non viene memorizzato nel buffer, ma ogni riga viene messa immediatamente in random . Ti consiglio inoltre di utilizzare tee nella tua pipe per vedere quante righe sono state prodotte:

hexdump /dev/urandom | grep --line-buffered -i "ffff f" | tee random
    
risposta data Dubu 26.06.2014 - 10:39
3

Il tuo file è vuoto perché il processo viene interrotto prima che il file venga scritto sul disco. È così che funziona il reindirizzamento. Per ovviare al problema, prova questo:

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

In pratica scriverà tutto l'output dello schermo sul file.

    
risposta data Jos 26.06.2014 - 10:08
3

cat /dev/urandom|hexdump o hexdump /dev/urandom scrive continuamente sullo stdout e se si preme Ctrl + C dopo questo non verrà eseguito nulla. Ma puoi limitare l'output con head

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

questo grep nelle prime 1000000 righe dell'output e scrive il risultato in un file.

    
risposta data TuKsn 26.06.2014 - 10:31
1

Dovrai scrivere l'output di cat /dev/urandom | hexdump in un file prima di eseguirlo la volta successiva. Lo script sotto dovrebbe portare a termine quello che stai provando:

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

IFS è usato per dividere l'output in linee qui.

(Source)

    
risposta data jobin 26.06.2014 - 10:08

Leggi altre domande sui tag