grepなしでファイルを空にし、バイナリファイルとして処理します。

grepなしでファイルを空にし、バイナリファイルとして処理します。

現在、netcatパイプ出力がteeoutput.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.txtoutput.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バイトで構成されたブロックを未割り当てのままにすることができます。この特別な圧縮方法を作るといいます。スパースファイル

関連情報