0xFF 0x84 0x03 0x07
手間をかけずに、バイナリ ファイル内の 16 進文字列の出現をカウントする必要があります... Linux コマンド ラインからこのデータを簡単に取得する方法はありますか、それとも専用のコードを作成する必要がありますか?
5 に答える
のバージョンがパラメーターを受け取る場合grep
、-P
を使用grep -a -P
して、バイナリ ファイル内の任意のバイナリ文字列を検索できます。これはあなたが望むものに近いです:
grep -a -c -P '\xFF\x84\x03\x07' myfile.bin
-a
バイナリ ファイルがスキップされないようにする-c
カウントを出力する-P
\xNN
パターンが Perl 互換の正規表現 (PCRE) であることを指定します。これにより、文字列に上記の形式の 16 進文字を含めることができます。
残念ながら、grep -c
実際の出現ではなく、パターンが表示される「行」の数のみをカウントします。
で正確な出現回数を取得するには、次のことgrep
を行う必要があるようです。
grep -a -o -P '\xFF\x84\x03\x07' myfile.bin | wc -l
grep -o
各一致を独自の行に分割しwc -l
、行を数えます。
これはすべて、バイナリ文字列に改行が含まれていないという事実に依存していることに注意してください。
この方法で改行を grep する必要がある場合、私が考えることができる最も簡単なことはtr
、検索語に含まれていない別の文字に文字を交換することです。
# set up test file (0a is newline)
xxd -r <<< '0:08 09 0a 0b 0c 0a 0b 0c' > test.bin
# grep for '\xa\xb\xc' doesn't work
grep -a -o -P '\xa\xb\xc' test.bin | wc -l
# swap newline with oct 42 and grep for that
tr '\n\042' '\042\n' < test.bin | grep -a -o -P '\042\xb\xc' | wc -l
のようにhexdumpを使用します
hexdump -v -e '"0x" 1/1 "%02X" " "' <filename> | grep -oh "0xFF 0x84 0x03 0x07" |wc -w
hexdump
0xNN のような指定された形式でバイナリ ファイルを出力します
grep
行で繰り返される同じものを考慮せずに、文字列のすべての出現を見つけます
wc
あなたに最終的なカウントを与える
やってみましたgrep -a
か?
grepのmanページから:
-a, --text
Process a binary file as if it were text; this is equivalent to the --binary-files=text option.
どうですか:
$ hexdump a.out | grep -Ec 'ff ?84 ?03 ?07'
これはあなたの質問に完全には答えませんが、検索文字列がASCIIでファイルがバイナリである場合の問題を解決します:
cat binaryfile | sed 's/SearchString/SearchString\n/g' | grep -c SearchString
基本的に、「grep」はほとんどそこにありましたが、間に改行バイトがない場合は 1 回しかカウントされなかったため、改行バイトを追加しました。