web-dev-qa-db-fra.com

Rediriger une sortie vers un fichier à partir de la commande piping grep

Je cours ceci:

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

et je n’obtiens rien dans le fichier random, sa longueur est égale à zéro après l’interruption de la commande.

Comment faire écrire la sortie dans un fichier?

J'ai besoin d'écrire un résultat dans un fichier, qui devrait contenir des données de sortie comme ceci:

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

enter image description here

9
Ruslan Gerasimov

Utilisez l'option --line-buffered pour grep (et supprimez également l'inutile cat):

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

De cette façon, la sortie n'est pas mise en mémoire tampon, mais chaque ligne est immédiatement placée dans random. Je recommanderais également d'utiliser tee dans votre pipe pour voir combien de lignes ont été produites:

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

Votre fichier est vide car le processus est interrompu avant que le fichier ne soit écrit sur le disque. C'est ainsi que fonctionne la redirection. Pour contourner le problème, essayez ceci:

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

Cela va essentiellement écrire toutes les sorties d’écran dans le fichier.

3
Jos

cat /dev/urandom|hexdump ou hexdump /dev/urandom écrit en permanence sur la sortie standard et si vous appuyez sur Ctrl+C rien ne sera exécuté après cela. Mais vous pouvez limiter la sortie avec head

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

cela va grep dans les premières lignes 1000000 de la sortie et écrit le résultat dans un fichier.

3
TuKsn

Vous devrez écrire la sortie de cat /dev/urandom | hexdump dans un fichier avant de l'exécuter la prochaine fois. Le script ci-dessous devrait accomplir ce que vous essayez:

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

IFS est utilisé pour diviser la sortie en lignes ici.


(Source)

1
jobin