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はモニカを

回答:


14

これは、最初>に書き込むファイルを作成することで発生しました。ファイルがすでに存在する場合、その内容は削除されます。(また、STDINだけでなくファイルでも機能するcatため、ステートメントで使用する必要はまったくありgrepません。)

これを行う正しい方法は、一時ファイルを使用して読み取りまたは書き込みを行うことです。だからどちらか

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

関連:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.