仕事でとても便利なコマンドがあります。 [〜#〜] filename [〜#〜]を含むいくつかの16進rawファイル内で特定の[〜#〜] string [〜#〜]を検索します。 Linuxシステムでいつも使用しているコマンドは次のとおりです。
find . -name '**FILENAME**' | while read filename; do
xxd -p $filename | tr -d '\n' | grep -i "**STRING**" > /dev/null
if [ $? -eq 0 ];then
echo "STRING FOUND IN $filename";
fi;
done
このコマンドは作成しませんでした。 HP-UXシステムでは、xxdが存在しないため、xdを使用する必要があります。しかし、xxd-pと同じ結果を得る方法がわかりません。
このコマンドをHP-UXシステムで実行するように調整するにはどうすればよいですか?
私はHP-UXを使用していないため、これは xd(1) に対してのみチェックされています。
xd -b -An -v $filename
-An
はオフセットが表示されないようにします-b
のデフォルトは1バイトです(od
の場合は8進数、xd
の場合は16進数)-v
は、同一の行が*
に置き換えられるのを防ぎます(私のシステムを含め、多くのシステムにはod
がありますが、xd
はありません。したがって、移植性のために、代わりにod -tx1 -An -v $filename
を使用します。)
これにより、それぞれの間にスペースを入れて、個々の16進バイトが出力されます。 tr
コマンドをtr -d [:space:]
に変更すると、改行だけでなくすべての空白が削除されます。
これらすべてを結合して、スクリプトのxxd
とtr
の部分を置き換えて、次のようにする必要があります。
xd -b -An -v $filename | tr -d '[:space:]' | grep -i "**STRING**" > /dev/null
コマンド
xxd -p < file | tr -d '\n'
単純なPerlスクリプトに置き換えることができます
Perl -ne 'foreach $c (split(//,$_)) { printf "%02x",ord($c)}' < file