【问题标题】:Grep multiple bash parametersgrep 多个 bash 参数
【发布时间】:2013-08-08 12:13:01
【问题描述】:

我正在编写一个 bash 脚本,它将在多个文件中进行搜索。

我遇到的问题是我无法 egrep 作为参数传递给 bash 脚本的不确定数量的变量

我希望它执行以下操作:

给定随机数量的参数。即:

./searchline.sh A B C

对第一个执行 grep,然后将结果与其余的 egrep:

grep "A" * | egrep B | egrep C

我尝试做的是用 egreps 构建一个字符串:

for j in "${@:2}";
do
ADDITIONALSEARCH="$ADDITIONALSEARCH | egrep $j";
done

grep "$1" * "$ADDITIONALSEARCH"

但不知何故,这不起作用,似乎 bash 没有将“egrep”字符串视为 egrep。

大家有什么建议吗?

顺便说一句,我无法创建任何辅助文件,所以我猜 grep -f 不合适。另请注意,传递给 bash 脚本的参数数量是可变的,所以我不能执行 egrep "$2" | egrep "$3"。

提前致谢。

费尔南多

【问题讨论】:

  • @fedorqui: '|'意思是或,不是和。当您使用 egrep 管道时,您需要模式的交集,因此是 AND。

标签: linux bash grep


【解决方案1】:

安全的eval 可能是一个很好的解决方案:

#!/bin/bash

if [[ $# -gt 0 ]]; then
    temp=("grep" "-e" "\"\$1\"" "*")

    for (( i = 2; i <= $#; ++i )); do
        temp=("${temp[@]}" "|" "egrep" "-e" "\"\$$i\"")
    done

    eval "${temp[@]}"
fi

运行它:

bash script.sh A B C

【讨论】:

  • @chepner 是的,但我有时会选择让脚本更兼容。该方法适用于 bash 3.1+,我不知道 OP 是否有新版本。
  • 哇,eval 的使用(至少在我看来)实际上安全的!先生,为您 +1。
【解决方案2】:

您可以在这里使用递归来获得所需的管道数:

#!/bin/bash

rec_egrep() {
    if [ $# -eq 0 ]; then
        exec cat
    elif [ $# -eq 1 ]; then
        exec egrep "$1"
    else
        local pat=$1
        shift
        egrep "$pat" | rec_egrep "$@"
    fi
}

first_arg="$1"
shift
grep "$first_arg" * | rec_egrep "$@"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多