在单个 shell 脚本中执行独立的 grep

在单个 shell 脚本中执行独立的 grep

我有几个 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这意味着它创建数组作为占位符,但不会在其中输入任何信息(元素)。接下来的四行用四个元素填充数组,这些元素是正则表达式,由数字123和索引4。 (我使用这些索引是因为这似乎是您想要的,但您可以使用任何不同的字符串作为索引:例如,uno, dos,trescuatro, 或ant, bat,catdog. for语句for i in "${!regex[@]}",导致变量i迭代索引值1234。 (如果我省略了!和 said for i in "${regex[@]}",它将迭代元素值 、 line1\|here1line2\|here2。)当是时,减少到,它扩展为line3\|here3。因此,循环迭代(执行)四次,执行您想要的四个命令。line4\|here4$i1${regex["$i"]}${regex[1]}line1\|here1grep

如果您想并行运行这些grep进程,只需执行以下操作:

对于“${!regex[@]}”中的 i
        grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt"&
完毕
等待

______________
 如果索引是数字上不同的非负整数,则可以省略该declare语句。

相关内容