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说,恢复莫妮卡

Answers:


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

在重定向到同一文件(>)时,shell可能会在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

有关:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.