現在、netcat
出力をパイプしてtee
output.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.txt
output.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
¹ほとんどのファイルシステムでは、完全にヌルバイトで構成されるブロックを割り当てずに残すことができます。この特殊な圧縮方法は、スパースファイル。