Gato, Grep, saída de redirecionamento ... Arquivo em branco?

8

Eu apenas corri

cat /opt/webapplications/Word/readme.log | grep -v 'Apple'

e obtive a saída do CLI que eu esperava, que era todas as linhas readme.logque não continham ' Apple' ...

Em seguida eu corri ...

cat /opt/webapplications/Word/readme.log | grep -v 'Apple' > /opt/webapplications/Word/readme.log

No entanto, /opt/webapplications/Word/readme.logestá em branco.

Alguém pode me explicar por que isso aconteceu, ou a maneira correta que eu deveria ter feito isso?

Jeffrey L. Roberts
fonte
stackoverflow.com/questions/6696842/…
aaaaa diz restabelecer Monica
1
você está tentando ler e escrever os mesmos processos de arquivo e festança redirecionamentos primeiro (da direita para a esquerda)
aaaaa diz Reintegrar Monica

Respostas:

14

Isso aconteceu porque a primeira coisa a >fazer é criar o arquivo no qual deseja gravar - e, se o arquivo já existir, seu conteúdo será excluído. (Além disso, não há necessidade de usar catem sua declaração, pois grepfunciona em arquivos, não apenas em STDIN.)

A maneira correta de fazer isso é usar um arquivo temporário para ler ou gravar. Então também

cp /opt/webapplications/Word/readme.log /tmp/readme.log
grep -v 'Apple' /tmp/readme.log > /opt/webapplications/Word/readme.log

ou

grep -v 'Apple' /opt/webapplications/Word/readme.log > /tmp/readme.log
mv /tmp/readme.log /opt/webapplications/Word/readme.log

podia funcionar.

Jenny D
fonte
1

Ao redirecionar para o mesmo arquivo ( >), o shell pode criar / truncar o arquivo antes que o catcomando seja chamado e a entrada seja lida (consulte: Por que “classificar arquivo1> arquivo1” não funciona? ). Se você deseja filtrar o arquivo, é melhor redirecionar a saída para um arquivo diferente ou evitar o redirecionamento, por exemplo:

grep -v 'Apple' readme.log | tee readme.log

A maneira melhor e mais segura é usar editores no local projetados para esse tipo de operações, por exemplo

sed -i '.bak' '/Apple/d' readme.log

ou use ex(parte do Vim):

ex +g/Apple/d -cwq readme.log

Relacionado:

kenorb
fonte