一連のバイナリ ファイルがあり、それぞれにファイルの末尾近くに埋め込まれた文字列が含まれていますが、場所は異なります (各ファイルで 1 回だけ発生します)。文字列の場所からファイルの最後までファイルの一部を抽出し、それを新しいファイルにダンプする必要があります。
例えば。ファイルの内容が「AWREDEDEDEXXXERESSDSDS」で、対象の文字列が「XXX」の場合、必要なファイルの部分は「XXXERESSDSDS」です。
bashでこれを行う最も簡単な方法は何ですか?
一連のバイナリ ファイルがあり、それぞれにファイルの末尾近くに埋め込まれた文字列が含まれていますが、場所は異なります (各ファイルで 1 回だけ発生します)。文字列の場所からファイルの最後までファイルの一部を抽出し、それを新しいファイルにダンプする必要があります。
例えば。ファイルの内容が「AWREDEDEDEXXXERESSDSDS」で、対象の文字列が「XXX」の場合、必要なファイルの部分は「XXXERESSDSDS」です。
bashでこれを行う最も簡単な方法は何ですか?
PERL には、一致した正規表現の後の文字列の部分を具体的に参照する変数が組み込まれています。それが私が使用する方法です。Bash やユーティリティだけでなく、PERL も一般的にインストールされているので問題ありません。
以下は、あまりパフォーマンスの良くない小さなハック シェル ソリューションです。しかし、それは機能します。
スクリプト ファイルtail.sh
を次のように記述します。
#!/bin/sh
dd bs=1 if=$1 of=$2 skip=`grep --binary-files=text -m1 -b -o $3 $1 | cut -d ':' -f 1 | head -1`
tail.sh を呼び出す INPUTNAME OUTPUTNAME PATTERN
ps: 申し訳ありませんが、最初の投稿で grep のオプションを 1 つ忘れていました
あなたはstrings
しgrep
たいですか?
例えば
strings -n 3 myfilename | grep XXX
私はこの解決策を思いつきました:
ls -1 *.bin | xargs strings -n4 --radix=d -f | grep "string" | awk '{sub(/:/, ""); print $2 " " $1 " " $1".";}' | xargs -l1 split -b && rm *.aa
ls -1 *.bin 拡張子が「bin」のファイル名のみをリスト形式で出力します
xargs strings -n4 --radix=d -f ファイル内のすべての文字列とその位置を一覧表示し、出力にファイル名を含めます
grep "string" "string" を含む行を出力します (各ファイルで 1 回だけ発生します)。
awk '{sub(/:/, ""); print $2 " " $1 " " $1".";}' 文字列によって追加されたファイル名の後のコロンを削除し、文字列の位置、ファイル名、ピリオド付きのファイル名を出力します (この行は、分割コマンド
xargs -l1 split -b awk の出力を残りの引数として使用して、各行に対して分割コマンドを実行します。
rm *.aa 分割ファイルの最初の部分を削除します。「aa」は、分割ファイルの一部のデフォルトのサフィックスです。
おそらく、これを行うためのより良い/より高速な/安全な方法がありますが、私の目的には問題ありません。
strings -n3 file_binary | awk '/XXX/{gsub(/.*XXX/,"");print}'
これを試して:
grep -ao string.* filename
バイナリ データがあるため、出力をファイルにリダイレクトしたい場合があります。
grep -ao string.* filename > binary.out
または、テスト用にパイプするhexdump
か、同様の方法でパイプします。
grep -ao string.* filename | hd