Linux スクリプト では、テキスト文字列に特定の短い文字列が含まれているかどうかを知りたい場合があります。これを行うには多くの方法があります。シンプルで信頼性の高いテクニックをいくつか紹介します。
なぜこれが役立つのでしょうか?
文字列内でより小さい部分文字列を検索することは、一般的な要件です。 1 つの例としては 、ファイルまたは人間の入力からテキストを読み取り 、その文字列で特定の部分文字列を検索して、スクリプトが次に何を行うかを決定できるようにすることが挙げられます。構成ファイル内のラベルまたはデバイス名、またはユーザーからの入力行内のコマンド文字列を探している可能性があります。
Linux ユーザーには 、テキストを操作するためのユーティリティが 数多く用意されています。 Bash シェルに組み込まれているものもあれば、スタンドアロンのユーティリティまたはアプリケーションとして提供されているものもあります。 Unix 由来のオペレーティング システムが文字列操作機能を豊富に備えているのには理由があります。
ファイルのように見える ものの一部は単純なファイルではありません。これらは、ハードウェア デバイスやシステム情報のソースなどを表す特別なファイルです。オペレーティング システムによって実行される抽象化により、ファイルの外観と特性が与えられます。これらのファイルから情報をテキストとして読み取ることも、場合によっては書き込むこともできますが、これらは通常のファイルではありません。
テキストは、 ターミナル ウィンドウ でのコマンドの入力および出力としても使用されます。これにより、入力と出力のリダイレクトと パイプ処理が 可能になります。この機能は、Linux コマンドのシーケンスを連鎖させて、あるコマンドの出力を次のコマンドの入力として渡す機能を支えています。
その起源に関係なく、受信したテキストから重要な単語、コマンド、ラベル、またはその他の指標を検索することは、テキストベースのデータを扱う標準的な部分です。ここでは、独自のスクリプトに組み込むことができる簡単なテクニックのコレクションを示します。
Bash ビルトインを使用した部分文字列の検索
二重括弧 ”
[[...] ]
” 文字列比較テストを
if
ステートメント
で使用して、ある文字列に別の文字列が含まれているかどうかを判断できます。
このスクリプトをエディタにコピーし、「double.sh」という名前のファイルに保存します。
#!/bin/bash
if [[ “猿” = *”鍵”* ]];それから
エコー「鍵は猿の中にある」
それ以外
エコー「キーはモンキーにありません」
フィ
chmod
コマンド
を使用してスクリプトを実行可能にする必要があります。これは、スクリプトを実行可能にするために常に必要な手順です。スクリプト ファイルを作成するたびにこれを行う必要があります。それぞれの場合に、適切なスクリプトの名前に置き換えてください。
chmod +x double.sh
スクリプトを実行してみましょう。
./double.sh
これは、アスタリスク「
*
」が文字を含まない任意の文字列を表すため機能します。部分文字列「key」がターゲット文字列内にある場合、前後に文字があってもなくても、テストは true を返します。
この例では、部分文字列の前に文字があります。これらは最初のアスタリスクと一致します。部分文字列の後ろに文字はありませんが、アスタリスクもどの文字にも一致しないため、テストは合格します。
柔軟性を高めるために、リテラル文字列の代わりに 変数を 処理するようにスクリプトを変更できます。これがスクリプト「double2.sh」です。
#!/bin/bash
文字列=”猿”
部分文字列=”キー”
if [[ $string = *$substring* ]];それから
echo “$substring が $string で見つかりました”
それ以外
echo “$substring が $string に見つかりませんでした”
フィ
それがどのように実行されるかを見てみましょう。
./double2.sh
これも同様に機能しますが、リテラル文字列の代わりに変数名を使用できるという利点があります。この小さなソリューションを関数に変えると、最大限の柔軟性が得られます。
これがスクリプト「double3.sh」です。
#!/bin/bash
shopt -s nocasematch
文字列=”猿”
部分文字列=”キー”
大文字=「ロンドン」
チェック部分文字列()
{
if [[ $1 = *$2* ]];それから
echo “$1 で $2 が見つかりました”
それ以外
echo “$1 で $2 が見つかりませんでした”
フィ
}
check_substring “猿” “鍵”
check_substring $string $substring
check_substring $string “バナナ”
check_substring “ウェールズ” $capital
変数とリテラル文字列を組み合わせて使用して
check_substring
関数を呼び出します。
shopt
-s
(set) オプションとともに使用して
nocasematch
を設定し、一致で大文字と小文字を区別しないようにしました。
実行方法は次のとおりです。
./double3.sh
case
ステートメントでも、部分文字列をアスタリスクで囲むというテクニックを使用できます。これが「case.sh」です。
#!/bin/bash
shopt -s nocasematch
文字列=”ワラビー”
部分文字列=”壁”
case $string in
*$部分文字列*)
echo “$substring が $string で見つかりました”
;;
*)
echo “何も一致しませんでした: $string”
;;
イーサック
非常に長い
if
ステートメントの代わりに
case
ステートメントを使用する
と、スクリプトの読み取りとデバッグが容易になります。文字列に多くの考えられる部分文字列の 1 つが含まれているかどうかを確認する必要がある場合は、
case
ステートメントが最適な選択です。
./case.sh
部分文字列が見つかりました。
grep を使用した部分文字列の検索
Bash ビルトインを超えて、おそらく最初に手を伸ばすテキスト検索ツールは
grep
です。
grep
の本来の機能を使用して
、文字列内の文字列を検索して部分文字列を探すことができます。
このスクリプトは「subgrep.sh」と呼ばれます。
#!/bin/bash
文字列=”お粥ポット”
部分文字列 = “尾根”
if $(echo $string | grep -q $substring);それから
echo “$substring が $string で見つかりました”
それ以外
echo “$substring が $string に見つかりませんでした”
フィ
スクリプトは
echo
使用して文字列を
grep
に送信し、部分文字列を検索します。
-q
(静か) オプションを使用して、
grep
による標準出力への書き込みを停止します。
括弧「
(...)
」内のコマンドの結果がゼロの場合、一致が見つかったことを意味します。 Bash ではゼロは
true
に等しいため、
if
ステートメントが満たされ、
then
節が実行されます。
その出力が何であるかを見てみましょう。
./subgrep.sh
sed を使用した部分文字列の検索
sed
を使用して部分文字列を見つけることもできます。
デフォルトでは、
sed
入力されたすべてのテキストを出力します。
sed -n
を使用すると、これを防ぐことができます。印刷される行は、一致する行のみです。この式は、$substring の値に一致する行、または $substring の値を含む行を出力します。
"/$部分文字列/p"
$string
の値を、here リダイレクト
<<<
を使用して
sed
にフィードします。これは、値を現在のシェルのコマンドにリダイレクトするために使用されます。パイプとは異なり、サブシェルを呼び出しません。
最初の
-n
はテストです。
sed
コマンドからの出力がゼロ以外の場合は
true
を返します。
sed
からの出力がゼロ以外になる唯一の方法は、一致する行が見つかった場合です。その場合は、
$substring
$string
内に見つかったはずです。
これは「subsed.sh」です。
#!/bin/bash
文字列=”スウェーデン”
部分文字列=”エデン”
if [ -n “$(sed -n “/$substring/p” <<< $string)” ];それから
echo “$substring が $string で見つかりました”
それ以外
echo “$substring が $string に見つかりませんでした”
フィ
スクリプトを実行すると、期待どおりの応答が得られます。
./subsed.sh
比較が失敗するように
$substring
の値を編集することで、スクリプトのロジックをテストできます。
./subsed.sh
探すのはやめて、見つけました
awk
や
Perl
などの他のツールでも部分文字列を検索できますが、部分文字列の検索のような単純な使用例では、追加の機能や複雑さが保証されません。特に、Bash ビルトインを使用した部分文字列の検索は高速かつ簡単で、外部ツールは必要ありません。





