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 $? 
  • Как переформатировать блоки зоны named.conf в одну строку?
  • Как получить последние три последние даты файла журнала?
  • Повторяет номер терминала, на котором вы работаете?
  • Что делает `join 'с точки зрения равноценности в SQL или операций в реляционной алгебре?
  • Вставить многострочный текст перед первой соответствующей строкой в ​​файле
  • AWK | Динамическое преобразование строк в столбцы
  • Записать данные, перемещающиеся в новую строку
  • Отфильтровать 2-й вхождение текста между цитатами с помощью sed?
  • Как обработать несколько строк столбца
  • sed с несколькими командами, могу ли я использовать флаг w (write)?
  • Как заполнить пробелы в первом столбце значением, полученным из предыдущей непустой строки?
  • Interesting Posts

    переименование жирового объема

    Postfix, Courier и резервные копии – соответствующие разрешения для файлов?

    Почему приоритет fsck был введен в / etc / fstab?

    Ошибка vgextend Не удалось создать временное имя архива

    Не удается подключиться к моей системе Virtual Box Ubuntu

    Как избавиться от спама `mosh“ last -f / var / log / wtmp`?

    Debian – System (аудио) Настройки, нарушающие при запуске / остановке LXC

    Нестабильная сеть в интегрированной среде Debian

    Настройка одного и того же адреса хоста в разных сетях

    Отключенные записи fstab, отображаемые в открытых диалогах GTK

    cd во все каталоги, выполнить команду над файлами в этом каталоге и вернуться в предыдущий текущий каталог

    gmrun прекратил поиск добавленного пользователем пути

    Как эффективно создавать (только для чтения) как моментальный снимок, так и diffshot в одно и то же время?

    Обеспечивают ли журналирование файловые системы защиту от коррупции после сбоя питания?

    Пользовательский режим linux eth0, подключенный к локальному сетевому устройству, не подходит

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