>
faz o grep achar que o arquivo é binário porque é binário. O problema é que você esvaziou o arquivo, mas não interrompeu o programa que o estava preenchendo.
>output.txt
cria output.txt
, se não existir, e trunca para zero, se o fizer.
No ponto em que você executa >output.txt
, há um processo tee
que tem o arquivo aberto. Truncar o arquivo não afeta a posição na qual tee
está escrevendo. Digamos que ele tenha escrito N bytes antes do truncamento. Na próxima vez que tee
escrever após o truncamento, ele começará a gravar na posição N . Escrever em uma posição além do final atual de um arquivo é permitido e preenche o início do arquivo com bytes nulos.¹ Foi o que aconteceu aqui.
O Grep vê um arquivo que começa com alguns bytes nulos. Ele relata corretamente o arquivo como binário.
Você pode dizer ao GNU grep para tratar o arquivo como texto chamando grep -a
. Ele irá procurar o arquivo inteiro, incluindo os bytes nulos (que não correspondem, para que eles não afetem o resultado, a menos que haja uma correspondência na primeira linha, mas eles podem causar lentidão se houver muitos deles).
Uma solução melhor é informar tee
para sempre gravar no final atual do arquivo. Felizmente (como Stephane Chazelas comentou , há uma opção para isso: tee -a
(presente em todos os sistemas compatíveis com POSIX). Você precisará truncar o arquivo primeiro.
>output.txt
nc -l -k -p 9100 | tee -a output.txt
¹ A maioria dos sistemas de arquivos permite que blocos que consistam inteiramente de bytes nulos permaneçam não alocados. Esse método especializado de compactação é chamado de criação de um arquivo esparso .