используя grep или awk, чтобы найти файлы, содержащие «a» и «b», которые находятся в разных строках - PullRequest
2 голосов
/ 23 сентября 2010

Есть ли способ использовать grep или awk для поиска текстовых файлов, которые содержат, например, "a" и "b", но в этом случае "a" и "b" находятся в разных строках?

Ответы [ 4 ]

5 голосов
/ 23 сентября 2010

Вот простое решение awk:

awk 'BEGIN {acnt=0; bcnt=0;} /a/ {acnt++;} /b/ {bcnt++} END { if (acnt > 0 && bcnt > 0) print "Matches"; }' $FILE

Несколько проще - просто использовать grep, используя его возвращаемое значение в качестве индикатора того, что значение было найдено:

grep -l a $FILE && grep -l b $FILE && echo "Both a and b found in $FILE"

Возможно, вы захотите перенаправить стандартный вывод, но вышеупомянутое должно быть простым и функциональным.Вы можете обернуть его в цикл, если хотите:

files=""
for x in *; do
    grep -l a $x && grep -l b $x && files="$files $x" # assuming no spaces
done
# now you can iterate over $files
2 голосов
/ 23 сентября 2010
awk '/a/{f=1}/b/{g=1}END{if(f && g) print "matches"}' file
0 голосов
/ 23 сентября 2010

Посмотрите, работает ли это для вас:

grep -lP '(?m)(a.*(.*\n)*.*b)|(b.*(.*\n)*.*a)' *
0 голосов
/ 23 сентября 2010

Возможно, вы сможете что-то сделать вместе с какой-нибудь неприятной оболочкой, которая проанализировала вывод grepping для «a» и использовала его для создания списка файлов для grep для «b», но если бы это был я, я бы составить короткий Perl-скрипт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...