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
Связанные с: