Параметры Grep с несколькими параметрами bash
Я пишу bash script, который будет искать в нескольких файлах.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу egrep неопределенное количество переменных, переданных в качестве параметров в bash script
Я хочу, чтобы он сделал следующее:
Задано случайное число параметров. то есть:
./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 script, является переменной, поэтому я не могу выполнить egrep "$ 2" | egrep "$ 3".
Спасибо заранее.
Фернандо
Ответы
Ответ 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
Ответ 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]"