Cat, Grep, Redirect Output ... Arquivo em branco?

7

Eu apenas corri

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

e recebi a saída no cli que eu esperava, que eram todas as linhas em readme.log que não continham ' Apple ' ...

A seguir corri ...

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

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

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

    
por Jeffrey L. Roberts 17.04.2016 / 10:19

2 respostas

13

Isso aconteceu porque a primeira coisa que o > faz é criar o arquivo que deseja gravar - e se o arquivo já existir, seu conteúdo será excluído. (Além disso, não é necessário usar cat em sua instrução, pois grep funciona em arquivos, não apenas em STDIN.)

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

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

funcionaria.

    
por 17.04.2016 / 10:35
1

Ao fazer o redirecionamento para o mesmo arquivo ( > ), o shell pode criar / truncar o arquivo antes que o comando cat seja chamado e a entrada seja lida (consulte: Por que o" arquivo1 > arquivo1 "não funciona? ). Se você quiser 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 que são projetados para esse tipo de operação, por exemplo

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

ou use ex (parte do Vim):

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

Relacionados:

por 17.04.2016 / 22:59

Tags