web-dev-qa-db-ja.com

HP-UXの「xxd-p」代替-「xd」で同じ結果を得る方法は?

仕事でとても便利なコマンドがあります。 [〜#〜] 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システムで実行するように調整するにはどうすればよいですか?

2
EXHALEXHALE

私は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:]に変更すると、改行だけでなくすべての空白が削除されます。

これらすべてを結合して、スクリプトのxxdtrの部分を置き換えて、次のようにする必要があります。

xd -b -An -v $filename | tr -d '[:space:]' | grep -i "**STRING**" > /dev/null
2
JigglyNaga

コマンド

xxd -p < file | tr -d '\n'

単純なPerlスクリプトに置き換えることができます

Perl -ne 'foreach $c (split(//,$_)) { printf "%02x",ord($c)}' < file
1
Stephen Harris