Cat, Grep, Redirect Output.... Пустой файл?

Я только что побежал

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

и я получил вывод на CLI, что я ожидал, который был все строки в readme.log что не содержалоApple"...

Затем я побежал...

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

Тем не мение, /opt/webapplications/Word/readme.log пусто

Может кто-нибудь объяснить мне, почему это произошло, или правильный путь, которым я должен был пойти по этому поводу?

2 ответа

Решение

Это произошло потому, что первым делом > делает, чтобы создать файл, в который он хочет записать - и если файл уже существует, его содержимое будет удалено. (Кроме того, нет необходимости использовать cat в вашем заявлении с grep работает с файлами, а не только с STDIN.)

Правильный способ сделать это - использовать временный файл для чтения или записи. Так что либо

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

или же

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

должно сработать.

При перенаправлении в тот же файл (>), оболочка может создать / обрезать файл до cat Команда вызывается и ввод читается (см.: Почему не работает "sort file1 > file1"?). Если вы хотите отфильтровать файл, лучше перенаправить вывод в другой файл или вообще избегать перенаправления, например:

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

Лучше и безопаснее использовать встроенные редакторы, разработанные для таких операций, например:

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

или использовать ex (часть Vim):

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

Связанные с:

Другие вопросы по тегам