Binary grep on Linux?

后端 未结 6 1897
你的背包
你的背包 2020-12-13 18:53

Say I have generated the following binary file:

# 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)]\'          


        
6条回答
  •  孤街浪徒
    2020-12-13 19:38

    The bbe program is a sed-like editor for binary files. See documentation.

    Example with bbe:

    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
    

    Explanation

    -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
    

    You can also pipe it to sed to have a cleaner output:

    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
    

    Your solution with Perl from your EDIT3 give me an 'Out of memory' error with large files.

    The same problem goes with bgrep.

    The only downside to bbe is that I don't know how to print context that precedes a matched pattern.

提交回复
热议问题