grep’ping файлы для нескольких строк (не в одной строке)

Чаще признаюсь, что ищу файл, содержащий несколько строк.

В настоящее время я делаю:

grep -rl string1 | xargs grep -l string2 | xargs grep -l string3 

Есть ли инструмент, который делает это красивее?

Это grep s для string1 или string2 или string3 .

 grep -rl -e string1 -e string2 -e string3 

Я хочу файлы, которые содержат string1 и string2 и string3 но не обязательно в одной строке.

Может быть, один из современных grep s ( ag/ack/rg/sift ) может сделать это?

    4 Solutions collect form web for “grep’ping файлы для нескольких строк (не в одной строке)”

    Вы можете использовать grep следующим образом:

     grep -rzlP '(?s)(?=.*?string1)(?=.*?string2)(?=.*?string3)' . 
    • (?s) Известное «dot-all», которое сообщает grep, чтобы разрешить точку . для совпадения \n символов ewline.

    • (?=.*?pattern) : Положительный Lookahead, который соответствует любым символам . что вхождения встречаются ноль или более раз * и не являются жадными, за ними следует шаблон ( string1 , string2 , …).

    Вы можете сделать функцию следующим образом (POSIX bash & zsh ):

     mgrep() { eval grep -rzlP $(printf ''\''(?s)'; printf '(?=.*?'\''"$%d"'\'')' $(eval echo {1..$#}); printf ''\''') . ; } 

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

     mgrep string1 string2 string3 

    он также будет обрабатывать все типы шаблонов, которые поддерживает сама grep ( заранее отрегулируйте опцию grep в соответствии с вашими требованиями ).

     mgrep string 'pattern with space' '\d+' [0-9] [...] 

    С agrep (исходный примерный grep , а не тот из tre ) вы можете сделать

     agrep -ld '$x' 'pattern1;pattern2;pattern3' 

    Где мы используем регулярное выражение, которое не может соответствовать ( $x , что-то после конца) в качестве разделителя.

    (используйте рекурсивные глобусы find или zsh рекурсивного поиска во всех файлах в каталоге).

    Обратите внимание, что шаблоны сопоставляются со всем содержимым файлов, а не с каждой строкой каждого файла.

    Вы можете написать это с помощью gawk:

     PATTERNS='pattern1;pattern2;pattern3' gawk -e ' BEGIN{n = split(ENVIRON["PATTERNS"], a, ";")} BEGINFILE{for (i in a) p[a[i]]; found = 0} { for (i in p) if ($0 ~ i) { if (++found == n) {print FILENAME; nextfile} delete p[i] } }' -E /dev/null file1 file2... 

    (хотя это довольно медленно).

    На основании ответа αғsнιη:

     mgrep() { grep -rzlP "(?s)$(printf "(?=.*?%s)" "$@")" . } mgrep string1 string2 string3 

    Следующее предложение простое, но, вероятно, может быть более эффективным и надежным.

     #!/bin/bash tab=(one three five) # grep_all's return status indicates if all patterns have at least # one matching result in the text file specified as argument. grep_all() { local -n patterns=$1 # allows to refer to an array local file=$2 # abort if a pattern is not found for pattern in "${patterns[@]}"; do if ! grep -q -e "$pattern" "$file"; then return 1 fi done } grep_all tab file.txt echo $? 
    Interesting Posts

    Экземпляры Getty в процессе init

    Как удалить несколько файлов с помощью sftp

    конвертировать временную метку unix на сегодняшний день в оболочку Android

    Как скопировать файлы с одной машины на другую с помощью ssh

    «Список аргументов слишком длинный»: как мне с этим справиться, не меняя мою команду?

    Отображение акцентов на консоли Linux

    Звук не работает, когда звуковая карта и HDMI используют драйвер Intel HDA. Как изменить порядок загрузки своих устройств?

    Концепция отображения памяти в Unix-подобных системах

    Удаление неистинной группы с идентификатором группы как основной группой пользователя

    обновить завиток на centos5

    Как сделать tar сохранить архив на удаленном компьютере, используя sftp или ftp?

    Имя папки изменилось, когда SCP с iPhone на сервер Synology

    Работает ли функция escaping?

    Непоследовательность в поведении «rm» при подключенном томе?

    Как подключить Wiimote к системе Fedora 19?

    Linux и Unix - лучшая ОС в мире.