文字列コマンドとgrepの組み合わせ:結果をnullで終わる文字列に制限する方法

文字列コマンドとgrepの組み合わせ:結果をnullで終わる文字列に制限する方法

stringsこれが私の努力を妨げているという感じがします。残念ながら、私が使用したいバイナリは、stringsファイルごとに複数の一致を生成します。ただし、100%のルールは、ファイルの1つにNUL末尾に文字がある文字列が正確に含まれていることです。私が欲しい文字列です。私もやはりこのように努力している。偽の肯定的な除去最初から。

残念stringsながら、ヌルバイトを保存する方法を教える方法がないようです。grepsome_expression\0

例示ライン:(簡体)

$ find . -maxdepth 1 -type f -size +1M -print0 | xargs -0 strings -fwn 3 | grep -w 'XYZ'

strings言えば、維持する文字を使用すると、パイプの端などが後で表示されること\0があります。... | grep -w 'XYZ[^[:print:]]'ただし、もちろん、grepパイプラインの前のコマンドが完了している限り、できることはありません。削除済み'\0'。

私もこの問題を解決するための(やや醜い)方法を考えました。これは、tr処理中のファイル全体のすべての「\ 0」文字を「\ 177」(10進数255)に変換することです。ただし、これはあまりにも多くの誤検出を生成する可能性があります。

より良い解決策はありますか?

追加情報:この質問は最も一般的な場合(NUL)にのみ適用されますが、最適な解決策は、文字列の終了に使用される印刷できない他の文字にも簡単に適用するのに適した解決策として定義されます。

答え1

よくgrepやったstrings。 GNU grepがある場合は、-z改行で区切られたレコードの代わりにnullで区切られたレコードを読み取るためのオプションを渡します。これはファイルの最後でも一致しますが、実際には問題ありません。

find . -maxdepth 1 -type f -size +1M -print0 |
xargs -0 grep -Eoz '[[:print:]]{3,}$'

GNU ユーティリティがない場合は、ファイルを渡してtrヌルバイトを改行文字に置き換えます。これにより、trガーベッジ文字を印刷できない文字に設定します。

find . -type d -prune -o -type f -size +1024k -exec sh -c '
  for x; do
    <"$x" tr \\0\\n \\n\\0 | tr -dsC "[:print:]" \\n |
    grep ...
  done
' _ {} +

関連情報