Grep сохраняет (выводит) весь файл .txt, если одна строка содержит строку

Grep сохраняет (выводит) весь файл .txt, если одна строка содержит строку

я знаю это

grep -rhI "# Active" > out.txt 

выведет любую строку, содержащуюся # Activeв искомом каталоге, но мне нужно все содержимое файла .txt, поэтому пример

пример.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

Итак, если я выполняю grep, # Activeя хочу, чтобы он вывел не только строку, содержащуюся # Activeв этих .txt-файлах, но и все остальные строки, например

выход.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

решение1

Для не-GNU версий grep, которые вряд ли будут иметь -z, или если требуется переносимость...

grep -q pattern file && cat file

-qподавляет любой вывод, но, как обычно, статус выхода устанавливается на основе того, было ли найдено соответствие шаблону. При совпадении с шаблоном grepвозвращается код успеха 0, который эквивалентенистинныйи это позволяет catвыполнить команду.

решение2

Обычно grep просто покажет соответствующую строку:

$ grep -rhI "# Active"
Line3 # Active

Чтобы увидеть весь файл, добавьте флаг -z:

$ grep -rhIz "# Active"
Line1 
Line2
Line3 # Active
Line4
Line5
etc

-z— это расширение GNU, которое сообщает grep, что не нужно использовать новую строку в качестве разделителя «строк», а вместо этого использовать символ NUL. Поскольку текстовые файлы обычно не содержат символов NUL, это приводит к тому, что grep читает весь файл, как если бы это была одна «строка». Следовательно, если есть совпадение, выводится весь файл.

В версиях grep для BSD/OSX опция ввода NUL недоступна и -zозначает нечто другое.

Другие параметры grep

-rуказывает grep выполнять рекурсивный поиск в файлах и каталогах.

-Iговорит grep игнорировать двоичные файлы

-hсообщает grep о необходимости вывести совпадение без прикрепленного имени файла.

решение3

sedальтернатива:

sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile

Этот скрипт работает, накапливая строки в hстаром буфере (и удаляя их) до тех пор, пока не встретится совпадающая строка, после чего он xизменяет буферы и выполняет n(т. е. печатает и получает следующую строку) до тех пор, пока не будет больше ввода.

решение4

Если вы хотите сделать это с несколькими файлами:

cat `grep -rIl "# Active" *`

Grep вернет список имен файлов, а cat их распечатает.

Связанный контент