创建一个执行多个 grep 操作(AND 操作)的 shell 脚本

creating a shell script that does mutilple grep operation (AND operation)

我有一个数据文件如下。

datafile

Sterling|Man City|England
Kane|Tottenham|England
Ronaldo|Man Utd|Portugal
Ederson|Man City|Brazil

如果我想找到具有“曼城”和“英格兰”特征的球员,我会在解释器中编写这样的命令。

grep "Man City" datafile | grep "England"
output: Sterling|Man City|England

像这样,我想制作一个 shell 脚本,它接收多个(超过 1 个)参数,找到包含所有参数的行。它将接收作为 arg1 arg2 arg3... 和 return 所有具有参数的数据行的输入。该程序将 运行 像这样。

$ ./find ManCity England 
output: Sterling|Man City|England

但我完全不知道如何实现为每个参数执行多个 grep 的命令。您可以使用 for 循环并在执行类似操作的代码中实现吗?

grep arg1 datafile | grep arg2 | grep arg3 ... 

此外,如果有更好的方法来找到包含所有参数(以及参数的)的数据行,你能告诉我怎么做吗?

您可以使用 awk 命令来执行此操作。 awk是一个非常有用的命令,也支持循环。

下面是查找多个模式的 AND 的 awk 命令:

> awk '/Man City/ && /England/' test.txt

Sterling|Man City|England

如果你想做或:

> awk '/Man City/ || /England/' test.txt
Sterling|Man City|England
Kane|Tottenham|England
Ederson|Man City|Brazil

Reference

你需要这个:

#!/bin/bash
myArray=( "$@" ) # store all parameters as an array
grep="grep ${myArray[0]} somefile" # use the first param as the first grep
unset myArray[0]; # then unset the first param
for arg in "${myArray[@]}"; do 
   grep="$grep | grep '$arg'" # cycle through the rest of the params to build the AND grep logic
done
eval "$grep" # and finally execute the built line