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

То, что вы видите с ls, является записью mask ACL. Из man setfacl запись mask, по-видимому, отражает максимально возможные разрешения, которые могут быть установлены в записи ACL.

разрешения записи маски дополнительно корректируются, чтобы включить объединение всех разрешенных прав по записи маски

Права доступа, которые вы видите в вашем примере с ls для группы по умолчанию root:rwx, ошибочны, поскольку эффективные права теперь контролируются ACL.

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

7 ответов

На всякий случай, если файлы очень большие, и два прохода на них дороги, и вы хотите только имена файлов, используя 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
ответ дан 22 May 2018 в 11:21
  • 1
    @muru может помочь с синтаксисом сохранения имени файла в файл вместо его печати – user1573232 19 April 2018 в 08:36
  • 2
    @ user1573232 просто положил > output-file в конце команды – muru 19 April 2018 в 08:41

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

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, так и [ f7] в Dir1 и Dir2 для тестирования:

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

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

[ f4]

Пример:

~/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
ответ дан 22 May 2018 в 11:21
grep -Erzl 'STR1.*STR2|STR2.*STR1'

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

Точнее:

grep -Erzl 'AccessToken.*Registrationrequest|Registrationrequest.*AccessToken'
2
ответ дан 22 May 2018 в 11:21

while loop

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

while read -rd '' filename; do
    if grep -q "AccessToken" "$filename" && 
        grep -q "Registrationrequest" "$filename"
    then
        echo "$filename"
    fi
done < <(find . -type f -print0)
1
ответ дан 22 May 2018 в 11:21

while loop

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

while read -rd '' filename; do
    if grep -q "AccessToken" "$filename" && 
        grep -q "Registrationrequest" "$filename"
    then
        echo "$filename"
    fi
done < <(find . -type f -print0)
1
ответ дан 17 July 2018 в 16:34
grep -Erzl 'STR1.*STR2|STR2.*STR1'

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

Точнее:

grep -Erzl 'AccessToken.*Registrationrequest|Registrationrequest.*AccessToken'
2
ответ дан 17 July 2018 в 16:34

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

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

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

6
ответ дан 17 July 2018 в 16:34

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

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