У меня есть коллекция файлов. Я хочу просмотреть их все с помощью 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
для нечувствительности к регистру.