現在、netcat
パイプ出力がtee
output.txtに書き込まれています。
nc -l -k -p 9100 | tee output.txt
この出力を監視したいので、関連ビットのみを見るためにtail -f | egrep -i 'regex'
PuTTYを介して視聴します。
時々、出力ファイルを消去したいと思います。発生する問題は、これを実行して> output.txt
からやり直してもtail -f | egrep ...
結果が得られないことです。ファイルを検索すると、一致するものがあることを知っていても、一致するものは得られません。しなければならない一致(cat output.txt
ファイルを正しく吐き出します)
mitch@quartz:~$ grep output.txt -e 'regex'
Binary file output.txt matches
そして、output.txtにも同じコマンドを使用してください。今後空の場合はうまくいきます。
基本的に>
、人々はgrep
私のファイルがバイナリだと思うようにし、正しく検索できないようにします。ファイルを消去するより良い方法はありますか?
答え1
唯一の問題がgrep
バイナリとして扱うことであれば、grep
とにかく検索してください。
$ head /bin/bash > out
$ echo "test" >> out
$ grep test out
Binary file out matches
$ grep -a test out
test
からman grep
:
-a, --text
Process a binary file as if it were text; this is equivalent to
the --binary-files=text option.
答え2
あなたの質問に答えることができるので、あなたが実行したいくつかのテスト結果は次のとおりです。
$ > output.txt
$ file output.txt
output.txt: empty
$ echo "" > output.txt
$ file output.txt
output.txt: very short file (no magic)
$ echo " " > output.txt
$ file output.txt
output.txt : ASCII text
ご覧のとおり、ファイルは実際のコンテンツとは異なるように分類されます。「置くこれを消去しようとすると、「が含まれています。したがって、何もない代わりに空の文字列を使用することをお勧めします。
答え3
>
grep はファイルがバイナリだと思うようにします。なぜならバイナリだからです。問題は、ファイルを空にしましたが、ファイルを埋め込んだプログラムを停止しなかったことです。
>output.txt
output.txt
存在しない場合は作成し、存在する場合は長さをゼロに切り捨てます。
>output.txt
プロセスを実行するとtee
ファイルが開いています。ファイルを切り捨ててもファイルがtee
書き込まれる場所には影響しません。書いたと仮定すると窒素切り捨て前のバイト数です。tee
次回に切り捨てて書き込むときは、この位置から書き込みが始まります。窒素。現在のファイルの終わり以降に書き込みを許可し、ファイルの先頭をヌルバイトで埋めます。これがここで起こっていることです。
Grep は、いくつかの null バイトで始まるファイルをチェックします。ファイルをバイナリとして正しく報告します。
grepを呼び出してGNU grepにファイルをテキストとして処理するように指示できますgrep -a
。ヌルバイトを含むファイル全体を検索します。 (一致しないため、最初の行に一致しないと結果に影響はありませんが、多くの場合速度が遅くなる可能性があります。)
より良い解決策は、tee
常にファイルの現在の端に書き込むように指示することです。幸いなことに(スティーブン・チャジェラス コメント)オプションがあります:(tee -a
すべてのPOSIX互換システムに存在します)。まず、ファイルを切り取る必要があります。
>output.txt
nc -l -k -p 9100 | tee -a output.txt
ほとんどのファイルシステムでは、完全にnullバイトで構成されたブロックを未割り当てのままにすることができます。この特別な圧縮方法を作るといいます。スパースファイル。