Bash – Cat, Grep, Redirect Output…. Blank File

bashcatgreppipe

I just ran

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

and I got the output on the cli that I was expecting, which was all the lines in readme.log that did not contain 'Apple'…

Next I ran…

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

However, /opt/webapplications/Word/readme.log is blank.

Can anyone explain to me why this happened, or the correct way I should have gone about this?

Best Answer

This happened because the first thing > does is to create the file it wants to write to - and if the file already exists, its contents will be deleted. (Also, there's no need at all to use cat in your statement since grep works on files, not just on STDIN.)

The correct way to do this is to use a temporary file either to read from or to write to. So either

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

or

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

would work.

Related Topic