2013-08-08 2 views
1

Я пишу скрипт bash, который будет искать в нескольких файлах.Grep multiple bash parameters

Проблемы Я сталкиваюсь, что я не могу задать расширенную неопределенное количество переменных, передаваемые в качестве параметров сценария Баша

Я хочу это сделать следующее:

Учитывая случайное число параметры. то есть:

./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".

Заранее спасибо.

Фернандо

+0

@fedorqui: '|' означает ИЛИ, а не. Когда вы набираете egrep, вам нужно пересечение шаблонов, поэтому AND. – Bentoy13

ответ

2

Безопасная 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 
+0

Большое спасибо !!!! Работает как шарм !!! :) :) :) :) – user2664313

+1

'TEMP + = (" | "egrep -e" \ $$ I ")' немного легче читать. – chepner

+0

@chepner Да, но я решил сделать сценарий более совместимым. Метод работает с bash 3.1+, и я не знаю, имеет ли OP новую версию или нет. – konsolebox

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 "[email protected]" 
    fi 
} 

first_arg="$1" 
shift 
grep "$first_arg" * | rec_egrep "[email protected]"