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 $? 
  • sed заменяет соответствующую строку, которая не начинается с #
  • Добавить во второй столбец
  • Вывести обе строки при изменении столбца
  • Пробуждение к среднему столбцу на основе ключа во 2-м столбце
  • Как переместить строку из файла в другой файл на основе сопоставления с образцом?
  • Разобрать вывод с динамической шириной столбца и пустыми полями
  • Как удалить инверсные пары совпадений?
  • awk: разделить столбец, распечатать левую часть разделителя и вставить в середине csv
  • Как я извлекаю пути к файлам из текстового файла?
  • Interesting Posts

    Как печатать только уникальные совпадения из регулярного выражения?

    Выполнять только, если это функция bash

    GTK2, GTK3 или QT для оптимизированного приложения LXDE

    Странный процесс состояния D, вероятно, застрял в обработчике ошибок страницы?

    Переключить VI, чтобы использовать клавишу backspace вместо Control + H для backspace?

    Скажите mplayer, чтобы предотвратить заставку скринсейвера во время игры

    Как я могу проверить, установлено ли я несвободное программное обеспечение?

    Если «fsck -n / PATH» говорит об ошибках, то на 100% верно, что FS имеет ошибки?

    rsync перемещать файлы, оставлять каталоги?

    Преобразование MBR в GPT из-за двойной загрузки

    Как определить, какие команды установлены по умолчанию на Ubuntu, CentOS и Red Hat?

    Есть ли команда добавить новую строку в текстовый файл, если значение этой строки отличается от следующего?

    конвертировать djvu в pdf

    Выходные данные команды scp / sftp как для стандартного вывода, так и для файла на сервере linux

    Каковы недостатки использования policy_any в openssl.cnf?

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