目前我有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
如果不存在則創建,如果存在則將其截斷為零長度。
在您運行時>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
大部分檔案系統允許完全由空位元組組成的區塊保持未分配狀態。這種特殊的壓縮方法稱為製作稀疏文件。