Назад | Перейти на главную страницу

Как выполнить поиск по нескольким ключевым словам при использовании awk или grep?

У меня есть коллекция файлов. Я хочу просмотреть их все с помощью grep найти все и только те, которые содержат где-нибудь внутри обе струны keyword1 и keyword2.

Я также хотел бы узнать, как это сделать с помощью awk.

Для grep символ вертикальной черты разделяет строки в комбинации regexp; в некоторых системах может потребоваться использовать egrep для активации этой функции:

[madhatta@anni ~]$ egrep 'exact|obsol' /etc/yum.conf
exactarch=1
obsoletes=1

Я ожидал, что синтаксис awk будет похож.

Редактировать: Ага:

[madhatta@anni ~]$ awk '/exact|obsol/ {print $1}' /etc/yum.conf
exactarch=1
obsoletes=1

Изменить 2:

Вы уточнили свой запрос, поэтому вот как это сделать с помощью grep:

grep -l keyword1 * | xargs -d '\n' grep -l keyword2

Это будет искать все файлы в данном каталоге (*) для keyword1, передавая список совпадающих файлов второму grep, который будет искать вторую строку через xargs. Боюсь, я не стану делать это с awk поскольку это начинает звучать как домашнее задание. Если у вас есть экономическое обоснование использования awk, дайте нам знать.

Искать в одном файле

Использование grep для поиска строк с ключевым словом "keyword1" или "keyword2" в файле "myfile.conf":

grep -e "keyword1\|keyword2" myfile.conf

Выбег трубы | в zsh как минимум требуется символ с обратной косой чертой.

Искать во всех файлах в каталоге

Чтобы найти в каталоге файлы, содержащие "ключевое слово1" или "ключевое слово2":

grep -r -e "keyword1\|keyword2" /path/to/my/directory

Если вы хотите выполнить поиск без учета регистра, добавьте -i вариант тоже.

Если я правильно понимаю, вы хотите найти все файлы, содержащие keyword1 и keyword2 в определенной папке, поэтому попробуйте следующее:

$ find /path/to/folder -type f -print0 | xargs -0 grep -li "keyword1" | \
                                    xargs -I '{}' grep -li "keyword2" '{}'
  • -print0 | xargs -0 заботится об именах файлов с пробелами
  • -I говорит xargs заменить '{}' со списком аргументов
  • grep -li печатает имя файла вместо соответствующего шаблона. я использую -i для нечувствительности к регистру.