Grep多个bash参数

时间:2013-08-08 12:13:02

标签: linux bash grep

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

我遇到的问题是我无法将作为参数传递的未确定数量的变量归为bash脚本

我希望它能够执行以下操作:

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

./searchline.sh A B C

在第一个上做一个grep,然后用其余部分得到结果:

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”。

提前致谢。

费尔南多

2 个答案:

答案 0 :(得分:2)

安全评估可能是一个很好的解决方案

#!/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

答案 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 "$@"