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


8

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

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

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



1
вы пытаетесь прочитать и написать один и тот же файл и перенаправление процессов bash сначала (справа налево)
aaaaa говорит восстановить Monica

Ответы:


14

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

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


1

При выполнении перенаправления в тот же файл ( >) оболочка может создать / обрезать файл до 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

Связанные с:

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.