创建一个执行多个 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
你需要这个:
#!/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
我有一个数据文件如下。
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
你需要这个:
#!/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