grep
не имеет опции AND для сопоставления нескольких шаблонов, но вы можете по существу ИЛИ сопоставлять шаблоны, используя |
. Если вы используете расширенный синтаксис, вы можете комбинировать несколько шаблонов со всеми их комбинациями :
a.*b.*c|a.*c.*b|b.*a.*c|b.*c.*a|c.*a.*b|c.*b.*a
Но, вероятно, это не очень хорошая идея, если у вас есть более двух паттернов, так как количество комбинаций быстро растет.
Вы можете комбинировать свои zgrep
команды, используя -exec
. Используйте тихую опцию -q
для каждого zgrep
, кроме последнего (, который печатает имя файла, если он и все предыдущие greps нашли совпадение ).
find -mtime -$a -type f ! -name "*.bak*" \
-exec zgrep -iq "$b" {} \; \
-exec zgrep -iq "$c" {} \; \
-exec zgrep -il "$d" {} \; | sort
Поскольку у вас всего два ответа, я не думаю, что case
здесь правильное решение. Много способов сделать это; Я бы сделал что-то вроде этого:
action_list="list|add|remove|foo|bar"
if grep -qE "^(${action_list})$" <<< "${action_var}" ; then
echo valid
else
echo not valid ${action_var}
fi
Если вы используете bash или оболочку с аналогичным расширением переменных, это может быть предпочтительнее для удобочитаемости переменной списка:
action_list="list add remove foo bar"
if grep -qE "^(${action_list// /|})$" <<< "${action_var}" ; then
echo valid
else
echo not valid ${action_var}
fi