Redirecionar uma saída para um arquivo do comando pip grep

9

Estou executando isso:

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

e não recebo nada no arquivo random, ele permanece com tamanho zero depois que o comando é interrompido.

Como fazê-lo gravar a saída em um arquivo?

Eu preciso escrever um resultado em um arquivo, que deve conter dados de saída 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

insira a descrição da imagem aqui

Ruslan Gerasimov
fonte

Respostas:

13

Use a --line-bufferedopção para grep(e também se livre do inútil cat):

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

Dessa forma, a saída não é armazenada em buffer, mas todas as linhas são colocadas randomimediatamente. Eu também recomendaria usar teeno seu pipe para ver quantas linhas foram produzidas:

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

Seu arquivo está vazio porque o processo é interrompido antes de o arquivo ser gravado no disco. É assim que o redirecionamento funciona. Como solução alternativa, tente o seguinte:

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

Basicamente, isso gravará toda a saída da tela no arquivo.

Jos
fonte
Envolveu mais um comando, mas entregue. Obrigado.
Ruslan Gerasimov
3

cat /dev/urandom|hexdumpou hexdump /dev/urandomescreve continuamente no stdout e se você pressionar Ctrl+ Cnada será executado depois disso. Mas você pode limitar a saída comhead

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

isso ocorrerá grepnas primeiras 1000000 linhas da saída e gravará o resultado em um arquivo.

TuKsn
fonte
Envolveu mais um comando, mas deu um bom resultado. Obrigado.
Ruslan Gerasimov
1

Você precisará gravar a saída de cat /dev/urandom | hexdumpum arquivo antes de executá-lo na próxima vez. O script abaixo deve realizar o que você está tentando:

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

IFS é usado para dividir a saída em linhas aqui.


(Fonte)

jobin
fonte
grep "ffff f"perdeu
Ruslan Gerasimov