strings
これが私の努力を妨げているという感じがします。残念ながら、私が使用したいバイナリは、strings
ファイルごとに複数の一致を生成します。ただし、100%のルールは、ファイルの1つにNUL
末尾に文字がある文字列が正確に含まれていることです。私が欲しい文字列です。私もやはりこのように努力している。偽の肯定的な除去最初から。
残念strings
ながら、ヌルバイトを保存する方法を教える方法がないようです。grep
some_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
' _ {} +