grep を使用せずにファイルを空にし、その後バイナリファイルのように扱う

grep を使用せずにファイルを空にし、その後バイナリファイルのように扱う

現在、netcat出力をパイプしてteeoutput.txtに書き込んでいます。

nc -l -k -p 9100 | tee output.txt

この出力を監視したいので、tail -f | egrep -i 'regex'関連する部分だけが表示されるように PuTTY 経由で監視しています。

時々、出力ファイルをクリアしたいことがあります。クリアして> output.txtから再度実行しようとするとtail -f | egrep ...、出力がまったく得られないという問題が発生します。ファイルをgrepすると、一致するものがないことがわかります。すべき一致する(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存在しない場合は作成し、存在する場合は長さ 0 に切り捨てます。

を実行する時点では>output.txt、ファイルを開いているプロセスがあります。ファイルを切り捨てても、書き込みtee位置は影響を受けません。teeいいえ切り捨て前のバイト。切り捨て後の次回のtee書き込みでは、位置いいえファイルの現在の末尾を超えた位置への書き込みは許可されており、ファイルの先頭が null バイトで埋められます。¹ ここで起こったのはまさにそれです。

Grep は、ヌル バイトで始まるファイルを検出します。ファイルはバイナリとして正しく報告されます。

を呼び出すことで、GNU grep にファイルをテキストとして扱うように指示できますgrep -a。これにより、ヌル バイト (一致しないため、最初の行に一致がない限り結果に影響しませんが、ヌル バイトの数が多い場合は速度低下の原因となる可能性があります) を含むファイル全体が検索されます。

より良い解決策は、tee常にファイルの現在の末尾に書き込むように指示することです。幸いなことに(ステファン・シャゼラスは次のように述べた。) には、そのためのオプションがあります: tee -a(すべての POSIX 準拠システムに存在)。まずファイルを切り捨てる必要があります。

>output.txt
nc -l -k -p 9100 | tee -a output.txt

¹ほとんどのファイルシステムでは、完全にヌルバイトで構成されるブロックを割り当てずに残すことができます。この特殊な圧縮方法は、スパースファイル

関連情報