不使用 grep 清空文件,隨後將其視為二進位文件

不使用 grep 清空文件,隨後將其視為二進位文件

目前我有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.txtoutput.txt如果不存在則創建,如果存在則將其截斷為零長度。

在您運行時>output.txt,有一個tee進程打開了該檔案。截斷檔案不會影響tee寫入的位置。假設它已經寫了截斷前的位元組。tee截斷後下次寫入時,會從該位置開始寫入。允許在文件當前末尾之外的位置進行寫入,並用空字節填充文件的開頭。

Grep 看到一個以一些空位元組開頭的檔案。它正確地將文件報告為二進位。

您可以透過呼叫 來告訴 GNU grep 將檔案視為文字grep -a。它將搜尋整個文件,包括空字節(它們不匹配,因此它們不會影響結果,除非第一行有匹配,但如果它們很多,它們可能會導致速度減慢)。

更好的解決方案是告訴tee始終在文件的當前末尾寫入。幸運的是(如史蒂芬·查澤拉斯評論),有一個選項:(tee -a存在於所有 POSIX 相容系統上)。您需要先截斷該檔案。

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

大部分檔案系統允許完全由空位元組組成的區塊保持未分配狀態。這種特殊的壓縮方法稱為製作稀疏文件

相關內容