Есть ли какой-нибудь способ, которым я могу сказать, чтобы grep печатал каждую читаемую строку независимо от того, есть ли совпадение?
Option -C999сделает свое дело при отсутствии опции для отображения всех контекстных строк. Большинство других вариантов grep также поддерживают это. Однако: 1) вывод не производится, если совпадения не найдено, и 2) эта опция отрицательно влияет на эффективность grep: когда-C значение велико, многие строки могут быть временно сохранены в памяти, чтобы grep определил, какие строки контекста отображать, когда происходит совпадение. Обратите внимание, что реализации grep не загружают входные файлы, а читают несколько строк или используют скользящее окно поверх ввода. Часть «before» контекста должна храниться в окне (памяти), чтобы вывести строки контекста «before» позже, когда найдено совпадение.
Шаблон, такой как ^|PATTERN или PATTERN|$любой другой под-шаблон, соответствующий пустому совпадению, такой как [^ -~]?|PATTERNхороший трюк. Тем не менее, 1) эти шаблоны не показывают несоответствующие строки, выделенные как контекст, и 2) это не может быть использовано в сочетании с некоторыми другими опциями grep, такими как -Fи-w , например.
Так что ни один из этих подходов не устраивает меня. Я использую ugrep и расширенный grep с возможностью -yэффективно отображать все несоответствующие выходные данные в виде выделенных цветом строк контекста. Другие инструменты, подобные grep, такие как ag и ripgrep, также предлагают возможность сквозного доступа. Но ugrep совместим с GNU / BSD grep и предлагает расширенный набор опций grep, таких как -yи -Q. Например, вот что -yотображается в сочетании с -Q(интерактивный интерфейс запросов для ввода шаблонов):
ugrep -Q -y FILE ...
sed.sedрешение получает вас несколько цветов за счет дополнительной сложности (вместо примерно 30 символов , имеющих около 60 символов).