我有几个 grep 过滤器,通常用来解析特定信息。
第一个 grep: grep "pattern1\|pattern2\|pattern3\|" file.txt
第二个 grep:grep "patternA\|patternB\|patternC\|" file.txt
ETC。
我通常将每个 grep 应用于相同的内容file.txt
以获得独立的输出。
我想知道如何将这堆 grep 分组到一个 bash 脚本中,以便根据每种类型的 grep 获得独立的输出。
例如:输入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 来评估同一文件并在 shell 中打印,如下所示:
Pattern1
Pattern2
Pattern3
ETC。
每个 grep 应该独立评估整个文件。
答案1
如果我正确理解这个问题,它是关于如何使用grep
相同的选项和相同的输入执行相同的命令(),但使用不同的正则表达式参数和不同的输出多次。我猜你想避免不必要的重复/重复。
看来您想要一个正则表达式数组(搜索字符串):
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
这意味着它创建数组作为占位符,但不会在其中输入任何信息(元素)。接下来的四行用四个元素填充数组,这些元素是正则表达式,由数字1
、2
、3
和索引4
。 (我使用这些索引是因为这似乎是您想要的,但您可以使用任何不同的字符串作为索引:例如,uno
, dos
,tres
和cuatro
, 或ant
, bat
,cat
和dog
. †)for
语句for i in "${!regex[@]}"
,导致变量i
迭代索引值1
、2
、3
和4
。 (如果我省略了!
和 said for i in "${regex[@]}"
,它将迭代元素值 、
line1\|here1
和line2\|here2
。)当是时,减少到,它扩展为line3\|here3
。因此,循环迭代(执行)四次,执行您想要的四个命令。line4\|here4
$i
1
${regex["$i"]}
${regex[1]}
line1\|here1
grep
如果您想并行运行这些grep
进程,只需执行以下操作:
对于“${!regex[@]}”中的 i 做 grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt"& 完毕 等待
______________
† 如果索引是数字上不同的非负整数,则可以省略该declare
语句。