我写了一个脚本,将数据提供给一个名为ctffind的exe程序。 exe程序将一堆数据输出到我试图在日志文件中捕获的屏幕。
这就是我现在正在使用的
my $logout = logfile
open STDOUT, '>>', "$logout";
open my $PIPE1, '|-', '/opt/ctf/ctffind3_mp.exe' or die $!;
它可以将屏幕上显示的所有内容输出到日志文件中。
如果我more $logfile
文件按预期显示,则大约有5000行,并且大约有50行包含字符串“final values”。在我的下一步中我做grep "final values" logfile
它认为logfile是一个二进制文件而不起作用而是返回:
Binary file logfile matches
如何设置它以便正确编码日志文件? ctffind.exe在运行时也会生成二进制文件,这是问题的一部分吗?
答案 0 :(得分:3)
由于评论者的建议,我找到了两种不同的方法来解决问题:
可以将grep logfile
更改为grep -a logfile
。
可以使用strings logfile logfile2
制作日志文件的可用版本。
答案 1 :(得分:1)
文件的第一个块中的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
答案 2 :(得分:1)
ctffind3_mp.exe
可能有代码进行屏幕格式化,例如更改颜色,粗体,清除屏幕等。有几种方法可以消除这些:
cat -v
管道传输,这会将所有非打印表格转换为ASCII表示形式(例如NUL变为^@
)。$TERM
(或perl $ENV{'TERM'}
)设置为unknown
,希望程序不再发出颜色,粗体等任何特殊序列。