[英]perl: capturing STDOUT- logfile ends up binary
我寫了一個腳本,將數據輸入到一個名為ctffind的exe程序中。 exe程序向我試圖在日志文件中捕獲的屏幕上輸出一堆數據。
這是我現在正在使用的
my $logout = logfile
open STDOUT, '>>', "$logout";
open my $PIPE1, '|-', '/opt/ctf/ctffind3_mp.exe' or die $!;
它可以將屏幕上顯示的所有內容輸出到日志文件中。
如果我more $logfile
該文件將按預期顯示,它的長度約為5000行,並且包含字符串“最終值”的行數約為50。 在下一步中,我執行grep "final values" logfile
它認為日志文件是二進制文件,因此不起作用,而是返回:
Binary file logfile matches
如何設置它以便對日志文件進行正確編碼? ctffind.exe在運行時也會生成二進制文件,這是問題的一部分嗎?
由於評論者的建議,我發現了兩種解決問題的方法:
可以將grep logfile
更改為grep -a logfile
。
可以使用strings logfile logfile2
來創建strings logfile logfile2
的可用版本。
文件的第一個塊中的Ascii NUL(\\ 000)足以使Perl將該文件稱為“二進制”文件。
echo "hello world\000" > myfile
perl -E '$f=shift;open $fh,"<",$f or die;say -e $f && -B $f ? "binary":"text"' myfile
ctffind3_mp.exe
可能包含ctffind3_mp.exe
代碼來進行屏幕格式化,例如更改顏色,加粗字體,清除屏幕等。您可以通過以下幾種方法消除這些內容:
cat -v
管道cat -v
它,它將所有不可打印的內容轉換為ASCII表示形式(例如NUL變為^@
)。 $TERM
(或在perl $ENV{'TERM'}
)設置為unknown
,以希望程序不再發出任何特殊的顏色,粗體等順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.