バイナリファイルで一致する前のバイト数をGrepに設定しますか?

バイナリファイルで一致する前のバイト数をGrepに設定しますか?

grep -ao ...word file.bin私はしばしばテキストコンテンツ(「単語」)とその前にあるいくつかの注意事項を見つけるために使用します。

   -a, --text
          Process a binary file as if it were text; this is equivalent to the --binary-files=text option.
   -o, --only-matching
          Print  only  the  matched  (non-empty) parts of a matching line, with each such part on a separate
          output line.

そうですね。さて、次のように動作することに気づきました。まず、文字列warとその前にある1つの文字を見つけようとします。

$ grep -ao .war myfile.zip
/war
9war
$war
ʆwar

さて、ここで4回のクリックが発生しました。文字列warとその前の2文字を見つけるには、次の手順を実行します。

$ grep -ao ..war myfile.zip
>$war

では、どのような理由であるのか、結果は1つだけ表示されますか? !

私の考えでは、3つが欠落している場合、「最初の2文字」の値は0x00(C文字列の終わり)なので、対応する一致は出力grepされません。そうでなければ、まだ4つの結果が出ると予想されます(たとえば、前の最初の一致はファイルの先頭にあります。そうしないと、3つの結果が得られます)。

grepマッチ項目のnullバイトを単に「無視」(またはドットなどに置き換える)し、それを含む可能性のあるマッチングを印刷し続けるように説得できますか?それ以外の場合は、grepこれを実行できる他のツールはありますか?

ベストアンサー1

あなたのアプローチには少なくとも2つ(好ましくは3つ)の問題があります。

non-standard を使用してもラインベース-oですgrep。各行の出力に一致するすべての項目を見つけるためですo。これは、改行で区切られた文字シーケンスです(ASCIIベースのシステムでは、値が10/0x0aのバイト)。

だから:

grep -o ..war

war2 以降のインスタンスのみが返されます。数値(ここでは3つの問題の1つであるバイトではありません)改行を除いて。

たとえば、同様の入力では、<0x0a>Xwar0x0aバイトは前の行を区別し、次の行は以前に1文字しかなかったXwarところから始まりますwar

UTF-8ロケールでは、同様の入力で<0xff><0xc3><0xa9>war2バイトが文字を<0xc3><0xa9>形成しますéが、前の0xffバイトは無効であるため、文字を形成できません。

grepgrep通常、テキストでのみ機能するため、実装によっては NUL 文字や過度に長い行や改行で終わらない入力で作業すると問題が発生する可能性があります。

その後でxxwarwar見つかりますgrep -oxxwar、より多くの一致の検索が続くため、見つかりませんarwar

これらの問題は、次の方法を使用して解決できますperl

perl -l -0777 -ne 'print "$1$2" while m{(?<=(..))(war)}sg'

warインスタンスの前の 2 バイト (ユーザーロケールの文字ではない) を探し、入力消費を防ぐためにこれらの前のバイトに逆方向演算子を使用します。レコード区切り文字を不可能に設定するを使用して、-0777入力の各行ではなく入力全体を処理します。

おすすめ記事