愚かな質問かもしれませんし、答えが役に立たないかもしれませんが、私は疑問に思います。このstrings
コマンドとこのcat
コマンドは、バイナリ以外のファイルで同じです。これは本当ですか?それとも、strings
すべてのファイル形式で使用するときにいくつかの考慮事項がありますか?
答え1
デフォルト値は、strings
4つ以上の印刷可能文字を含む文字列を見つけることです。努力するecho abc | strings
。私はより微妙な違いがあると確信しています。したがって、タイトルの質問に対する答えは「いいえ」です。
さらに、2つのコマンドは目的が異なり、コマンドラインオプションセットも異なるため、非常に同じではありません。
答え2
もちろん、それらは同じではありません。以下は、プレーンテキストファイルの例です。
$猫file_with_newline_at_the_end 改行 他の行 $string file_with_newline_at_the_end 改行 他の行 $猫ファイル_without_newline_at_the_end
ご覧のとおりstrings
、空の行は無視してください。しかし、catはデフォルトでバイトストリーム全体を端末に渡します。これはcat
何も知らず、ファイルのエンコーディングに興味がないがstrings
興味があることを意味します。デフォルトではstrings
7ビットASCII文字のみが見つかるため、0x7Fより大きいバイトを持つ文字列は異なる出力を生成します。 UTF-16およびUTF-32ファイルも機能しませんが、このオプションを使用するとcat
GNUから正しく出力されます。strings
--encoding
strings
探す以外に印刷可能文字(0x20-0x7E)なので、垂直タブ(0x0B)などの制御文字を持つファイルは異なる出力を持ちます。
$ echo -e "abcd\x0bcdef" | $ echo -e "abcd\x0bcdef" |文字列 ABCD CDF $ echo -e "abcd\x0bcdef" | $ echo -e "abcd\x0bcdef" |cat ABCD CDF
-o
または-t
instrings
や-benstv
in など、さまざまな出力を生成するさまざまなオプションもあります。cat
別の違いは、strings
他の回答で述べたように、基本的に4文字以上の文字列を見つけることです。
グヌstrings
:
指定された各ファイルに対して、GNU文字列は、少なくとも4文字の長さ(または以下のオプションで指定されている数字)の印刷可能文字シーケンスと印刷できない文字を印刷します。
アップルシステムstrings
:
String は、バイナリファイルまたは標準入力で ASCII 文字列を検索します。文字列は、任意のオブジェクトファイルや他の多くのものを識別するのに役立ちます。文字列は、4つ(デフォルト)以上の印刷文字(他の文字またはEOFで終わるが含まれていません)のシーケンスです。 - フラグを指定しないと、ターゲットファイルの(
__TEXT
、__text
)部分を除くすべての部分から文字列を検索します。ファイルを指定しない場合は、標準入力を読み込みます。