6

0xFF 0x84 0x03 0x07手間をかけずに、バイナリ ファイル内の 16 進文字列の出現をカウントする必要があります... Linux コマンド ラインからこのデータを簡単に取得する方法はありますか、それとも専用のコードを作成する必要がありますか?

4

5 に答える 5

4

のバージョンがパラメーターを受け取る場合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
于 2016-05-30T23:01:44.080 に答える
1

のようにhexdumpを使用します

hexdump -v -e '"0x" 1/1 "%02X" " "' <filename> | grep -oh "0xFF 0x84 0x03 0x07" |wc -w

hexdump0xNN のような指定された形式でバイナリ ファイルを出力します

grep行で繰り返される同じものを考慮せずに、文字列のすべての出現を見つけます

wcあなたに最終的なカウントを与える

于 2013-03-11T10:46:02.170 に答える
0

やってみましたgrep -aか?

grepのmanページから:

-a, --text
              Process a binary file as if it were text; this is equivalent to the --binary-files=text option.
于 2013-03-11T10:38:47.720 に答える
0

どうですか:

$ hexdump a.out | grep -Ec 'ff ?84 ?03 ?07'
于 2013-03-11T11:24:59.187 に答える
0

これはあなたの質問に完全には答えませんが、検索文字列がASCIIでファイルがバイナリである場合の問題を解決します:

cat binaryfile | sed 's/SearchString/SearchString\n/g' | grep -c SearchString

基本的に、「grep」はほとんどそこにありましたが、間に改行バイトがない場合は 1 回しかカウントされなかったため、改行バイトを追加しました。

于 2013-08-14T16:49:17.213 に答える