perl:捕获STDOUT- logfile以二进制结束

时间:2012-09-07 19:27:46

标签: perl encoding stdout

我写了一个脚本,将数据提供给一个名为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在运行时也会生成二进制文件,这是问题的一部分吗?

3 个答案:

答案 0 :(得分:3)

由于评论者的建议,我找到了两种不同的方法来解决问题:

  1. 可以将grep logfile更改为grep -a logfile

  2. 可以使用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变为^@)。
  • 可能有特定的实用程序用于从文本中删除ANSI或VT100序列 - 请尝试询问超级用户。
  • 您可以尝试将$TERM(或perl $ENV{'TERM'})设置为unknown,希望程序不再发出颜色,粗体等任何特殊序列。