特定の情報を解析するために一般的に使用されるいくつかの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つの目的のコマンドを実行します。cuatro
ant
bat
cat
dog
for
for i in "${!regex[@]}"
i
1
2
3
4
!
for i in "${regex[@]}"
line1\|here1
line2\|here2
line3\|here3
line4\|here4
$i
1
${regex["$i"]}
${regex[1]}
line1\|here1
grep
これらのプロセスを並列に実行するには、grep
次のようにします。
「${!regex[@]}」から する grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt"& 完璧 待つ
______________
† インデックスが数字で区別される非負の整数の場合、このdeclare
ステートメントを省略できます。