Как к grep для двух шаблонов в нескольких файлах

У меня есть несколько файлов в нескольких каталогах, и мне нужна команда grep, которая может возвратить вывод только, когда оба шаблоны присутствуют в файле. Шаблоны похожи AccessToken и Registrationrequest. Шаблоны не находятся в той же строке. AccessToken может быть в одной строке и Registrationrequest может быть в другой строке. Также ищите то же рекурсивно через все файлы во всех каталогах.

Испытанный

grep -r "string1” /directory/file |  grep "string 2” 
grep -rl 'string 1' | xargs grep 'string2' -l /directory/ file
grep -e string1 -e string2 

Ничто не работает

Кто-либо может помочь?

1
задан 15 May 2018 в 22:00

4 ответа

На всякий случай файлы являются очень большими, и делающие два передает их, является дорогим, и Вы хотите просто имена файлов, с помощью find+awk:

find . -type f -exec awk 'FNR == 1 {a=0; r=0} /AccessToken/{a=1} /Registrationrequest/{r=1} a && r {print FILENAME; nextfile}' {} +
  • мы устанавливаем две переменные флага a и r поскольку то, когда соответствующие шаблоны были найдены, очистилось в начале каждого файла (FNR == 1)
  • когда обе переменные верны, мы печатаем имя файла и движение в следующий файл.
3
ответ дан 3 December 2019 в 06:19

Следующая команда может распечатать, когда файл соответствует критериям поиска:

grep -Zril 'String1' | xargs -0 grep -il 'String2'

Вот пример:

~/tmp$ ls
Dir1  Dir2  File1  File2

cat File1
AccessToken is not here
Registrationrequest it is here

cat File2
iAccess
ByteMe Registrationrequest

Я скопировал обоих File1 и File2 в Dir1 и Dir2 для тестирования:

~/tmp$ grep -Zril 'AccessToken' | xargs -0 grep -il 'Registrationrequest'
File1
Dir2/File1
Dir1/File1

Затем, если Вы хотите видеть то, что находится в файлах, добавляет следующее в конец поиска:

xargs grep -E "AccessToken|Registrationrequest"

Пример:

~/tmp$ grep -Zril 'AccessToken' | xargs -0 grep -il 'Registrationrequest' | xargs grep -E "AccessToken|Registrationrequest"
File1:AccessToken is not here
File1:Registrationrequest it is here
Dir2/File1:AccessToken is not here
Dir2/File1:Registrationrequest it is here
Dir1/File1:AccessToken is not here
Dir1/File1:Registrationrequest it is here

Надеюсь, это поможет!

5
ответ дан 3 December 2019 в 06:19
grep -Erzl 'STR1.*STR2|STR2.*STR1'

где опция -z заканчивает тем, что хлебал файлы как одну строку.

Более точно:

grep -Erzl 'AccessToken.*Registrationrequest|Registrationrequest.*AccessToken'
2
ответ дан 3 December 2019 в 06:19

while цикл

Это не может быть так же умно или эффективно при ресурсе как другие решения, но это работает:

while read -rd '' filename; do
    if grep -q "AccessToken" "$filename" && 
        grep -q "Registrationrequest" "$filename"
    then
        echo "$filename"
    fi
done < <(find . -type f -print0)
1
ответ дан 3 December 2019 в 06:19

Другие вопросы по тегам:

Похожие вопросы: