я знаю это
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 их распечатает.