Linux 你在运行32位系统?可能是一个简单的添加编译器标志的例子,如本期所述:-如果不是,开发人员可能会希望有一个bug报告。谢谢-它工作得很好!!除了我不知道为什么:)你介意添加一个链接来引用这里使用的语法吗?我自己也不是一个真正的Perl人,我不认为搜索会在像

Linux 你在运行32位系统?可能是一个简单的添加编译器标志的例子,如本期所述:-如果不是,开发人员可能会希望有一个bug报告。谢谢-它工作得很好!!除了我不知道为什么:)你介意添加一个链接来引用这里使用的语法吗?我自己也不是一个真正的Perl人,我不认为搜索会在像,linux,binary,grep,Linux,Binary,Grep,你在运行32位系统?可能是一个简单的添加编译器标志的例子,如本期所述:-如果不是,开发人员可能会希望有一个bug报告。谢谢-它工作得很好!!除了我不知道为什么:)你介意添加一个链接来引用这里使用的语法吗?我自己也不是一个真正的Perl人,我不认为搜索会在像“Perl($/,$\)语法””这样的查询中返回太多:哇,谢谢@tchrist!我改变了这个被接受的答案,只是因为它让我看到了Perl对“二进制grepping”的适用性:)还有很多事情要做——但现在,至少我可以参考一下,发现$/指的是“slu


你在运行32位系统?可能是一个简单的添加编译器标志的例子,如本期所述:-如果不是,开发人员可能会希望有一个bug报告。谢谢-它工作得很好!!除了我不知道为什么:)你介意添加一个链接来引用这里使用的语法吗?我自己也不是一个真正的Perl人,我不认为搜索会在像“
Perl($/,$\)语法”
”这样的查询中返回太多:哇,谢谢@tchrist!我改变了这个被接受的答案,只是因为它让我看到了Perl对“二进制grepping”的适用性:)还有很多事情要做——但现在,至少我可以参考一下,发现
$/
指的是“slurp模式”:)干杯!如何将其应用于任意二进制字符串?我尝试了您的
perl-ln0777e'print pos(),而/unclayal/g'/usr/bin/awk
方法来查找原始磁盘设备文件中丢失的内容,但perl在中途以“内存不足”的口吻向我吐了一口。您好@Chance,谢谢您的评论!我以前使用过
grep-a
,但是为了查找文本字符串(换句话说,ASCII范围内的字节),例如,我没有找到空字节序列。。另外,不确定是否可以说服grep输出匹配的字节偏移量。干杯感谢@Omniwombat,+1提供了一个有趣的选择!这对我来说非常有用,即使是使用奇怪的二进制字符和巨大的输入数据。而且它仍然使用熟悉的、通用的、普及的
grep
工具!谢谢你,@Doud-
bbe
看起来不错;非常感谢您提供的快速示例!干杯虽然有点晚了,但多亏了这一点——确实需要一个使用偏移量执行二进制操作的
grep
示例;干杯对于我来说,这在大于0x7f的二进制字符上似乎不起作用。Grep就是不匹配。@fuzzyTew我通过设置LANG=C(以前是LANG=pt_BR.UTF-8,可能Grep试图从我的字节流中解释unicode字符)使它工作。@Fr0sT为什么添加--text--perl regexp?如果您使用固定字节序列扫描二进制文件,则也不需要。是吗?@EnzoR
——text
更改输出模式。试着用它和不用它,看看有什么不同
# generate file:
python -c 'import sys;[sys.stdout.write(chr(i)) for i in (0,0,0,0,2,4,6,8,0,1,3,0,5,20)]' > mydata.bin

# get file size in bytes
stat -c '%s' mydata.bin

# 14
$ hexdump -v -e "1/1 \" %02x\n\"" mydata.bin | grep -n '00'

1: 00
2: 00
3: 00
4: 00
9: 00
12: 00
$ perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(.....\0\0\0\xCC\0\0\0.....)/g' /path/to/myfile.bin

ca000000cb000000cc000000cd000000ce     # Matched data (hex)
66357                                  # Offset (dec)
$ perl -ln0777e 'print join(" ", unpack("H2 "x17,$1)), "\n", pos() while /(.....\0\0\0\xCC\0\0\0.....)/g' /path/to/myfile.bin

ca 00 00 00 cb 00 00 00 cc 00 00 00 cd 00 00 00 ce
66357
% perl -ln0e 'print tell' < inputfile
% perl -e '($/,$\) = ("\0","\n"); print tell while <STDIN>' < inputfile
% perl -MO=Deparse,-p -ln0e 'print tell'
BEGIN { $/ = "\000"; $\ = "\n"; }
LINE: while (defined(($_ = <ARGV>))) {
    chomp($_);
    print(tell);
}
#!/usr/bin/env perl

use English qw[ -no_match_vars ];

$RS  = "\0";    # input  separator for readline, chomp
$ORS = "\n";    # output separator for print

while (<STDIN>) {
    print tell();
}
#!/usr/bin/env perl

use strict;
use autodie;  # for perl5.10 or better
use warnings qw[ FATAL all  ];

use IO::Handle;

IO::Handle->input_record_separator("\0");
IO::Handle->output_record_separator("\n");

binmode(STDIN);   # just in case

while (my $null_terminated = readline(STDIN)) {
    # this just *past* the null we just read:
    my $seek_offset = tell(STDIN);
    print STDOUT $seek_offset;  

}

close(STDIN);
close(STDOUT);
% perl -e 'print 0.0.0.0.2.4.6.8.0.1.3.0.5.20' > inputfile
#!/usr/bin/env perl
@values = (
    0,  0,  0,  0,  2,
    4,  6,  8,  0,  1,
    3,  0,  5, 20,
);
print pack("C*", @values);
print chr for @values;
print map { chr } @values;
#!/usr/bin/env perl

use strict;
use warnings qw[ FATAL all ];
use autodie;

binmode(STDOUT);

my @octet_list = (
    0,  0,  0,  0,  2,
    4,  6,  8,  0,  1,
    3,  0,  5, 20,
);

my $binary = pack("C*", @octet_list);
print STDOUT $binary;

close(STDOUT); 
% man perl
% man perlrun
% man perlvar
% man perlfunc
0: 1: 2: 3: 8: 11:
bbe -b "/\x00\x00\xCC\x00\x00\x00/:17" -s -e "F d" -e "p h" -e "A \n" mydata.bin

11:x00 x00 xcc x00 x00 x00 xcd x00 x00 x00 xce
-b search pattern between //. each 2 byte begin with \x (hexa notation).
   -b works like this /pattern/:length (in byte) after matched pattern
-s similar to 'grep -o' suppress unmatched output 
-e similar to 'sed -e' give commands
-e 'F d' display offsets before each result here: '11:'
-e 'p h' print results in hexadecimal notation
-e 'A \n' append end-of-line to each result
bbe -b "/\x00\x00\xCC\x00\x00\x00/:17" -s -e "F d" -e "p h" -e "A \n" mydata.bin | sed -e 's/x//g'

11:00 00 cc 00 00 00 cd 00 00 00 ce
grep --only-matching --byte-offset --binary --text --perl-regexp "<\x-hex pattern>" <file>
grep -obUaP "<\x-hex pattern>" <file>
grep -obUaP "\x01\x02" /bin/grep
153: <\x01\x02>
33210: <\x01\x02>
53453: <\x01\x02>