Назад | Перейти на главную страницу

Cat, Grep, перенаправить вывод… Пустой файл?

Я просто сбежал

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 пусто.

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

Это произошло потому, что первым делом > делает, чтобы создать файл, в который он хочет записать - и если файл уже существует, его содержимое будет удалено. (Кроме того, нет необходимости использовать 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 вызывается команда и считывается ввод (см .: Почему не работает «сортировать файл1> файл1»?). Если вы хотите отфильтровать файл, лучше перенаправить вывод в другой файл или вообще избегать перенаправления, например:

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

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

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

или используйте ex (часть Vim):

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

Связанный: