単一のシェルスクリプトでスタンドアロンgrepを実行する

単一のシェルスクリプトでスタンドアロンgrepを実行する

特定の情報を解析するために一般的に使用されるいくつかのgrepフィルタがあります。

最初のgrep: grep "pattern1\|pattern2\|pattern3\|" file.txt

2番目のgrep:grep "patternA\|patternB\|patternC\|" file.txt

など。

file.txt 私は通常、独立した出力を得るために同じコンテンツに各grepを適用します。

各grepタイプごとに別々の出力を取得できるように、このgrepバンドルをbashスクリプトにグループ化する方法を知りたいです。

たとえば、次のようにfile.txt入力します。

This line1 is the first line in here1
This line2 is the second line in here2
This line3 is the third line in here3
This line4 is the fourth line in here4

私は通常、特定のパターンを取得するためにここに別のgrepを適用します。

grep -h -r --color=always "line1\|here1" file.txt >>pattern1.txt

または

grep -h -r --color=always "line2\|here2" file.txt >>pattern2.txt

これにより、必要な情報のみが強調表示され、pattern*.txt作業する別のファイルが提供されます。ここでの目標は、これらのすべてのgrepを一度に実行して同じファイルを評価し、次のようにシェルから印刷することです。

  • Pattern1
  • Pattern2
  • Pattern3

など。

各grepはファイル全体を独立して評価する必要があります。

ベストアンサー1

grep質問を正しく理解している場合は、同じオプションと同じ入力を使用して同じcommand()を複数回実行しますが、正規表現パラメータと出力は異なる方法で実行できます。不要な重複/重複を避けたいようです。

正規表現配列(検索文字列)が欲しいようです。

declare -A regex
regex[1]="line1\|here1"
regex[2]="line2\|here2"
regex[3]="line3\|here3"
regex[4]="line4\|here4"

for i in "${!regex[@]}"
do
        grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt"
done

最初の行()は、次のdeclare -A regex連想配列を宣言します。regexこれは、配列をプレースホルダとして生成しますが、その中に情報(要素)を入れないことを意味します。次の4行は、数字と1インデックス2付き3の正規表現の4つの要素で配列を埋めます4。 (必要に応じてこのインデックスを使用しましたが、他の文字列をインデックスとして使用できます。たとえば、、、、、またはuno、、、dosおよび. tres(省略すると、要素の値とを繰り返します。)isがに減少すると拡張されます。したがって、ループは4回繰り返し(実行)して4つの目的のコマンドを実行します。cuatroantbatcatdogforfor i in "${!regex[@]}"i1234!for i in "${regex[@]}"line1\|here1line2\|here2line3\|here3line4\|here4$i1${regex["$i"]}${regex[1]}line1\|here1grep

これらのプロセスを並列に実行するには、grep次のようにします。

「${!regex[@]}」から
する
        grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt"&
完璧
待つ

______________
 インデックスが数字で区別される非負の整数の場合、このdeclareステートメントを省略できます。

おすすめ記事