Есть сценарий (давайте назовем его echoer
), который печатает на экране кучу информации. Я бы хотел видеть линии только после того, как шаблон найден.
Я представляю использование решения, чтобы выглядеть примерно так
echoer | solution_command <pattern>
В идеале pattern
было бы регулярным выражением, но для меня было бы достаточно строк с жесткими значениями.
Ответы:
AWK может сделать это с диапазонами шаблонов, что позволяет использовать любое регулярное выражение:
выведет
echoer
вывод, начиная с соответствия первой строкиpattern
.AWK основан на шаблонах и обычно используется с подходом типа «если этот шаблон соответствует, сделайте это». «Этот шаблон» может быть диапазоном шаблонов, определяемых как «когда этот шаблон соответствует, начинайте делать это, пока этот другой шаблон не будет соответствовать»; это определяется записью двух шаблонов, разделенных запятой, как указано выше. Шаблоны могут быть текстовыми совпадениями, например
/pattern/
, если текущая строка сверяется с шаблоном, интерпретируемым как регулярное выражение; они также могут быть общими выражениями, вычисляться для каждой строки и считаться совпадающими, если их результат ненулевой или непустой.В AWK действием по умолчанию является печать текущей строки.
Собрав все это вместе,
awk '/pattern/,0'
ищет совпадения строкpattern
и, как только он находит одну, применяет действие по умолчанию ко всем строкам до тех пор, пока0
условие не совпадет (не равно нулю).awk '/pattern/,""'
будет работать тоже.Руководство Gawk входит в гораздо более подробно.
источник
0
? Это будет/pattern/,/0/
? Как будет выглядеть ответ, явно выписывая действие по умолчанию?/pattern/,/0/
будет печатать, пока не найдет строку (запись), содержащую «0». Запись фрагмента в ответ с явным действием дает/pattern/,0 { print $0 }
или эквивалентно/pattern/,0 { print }
.Обязательный
sed
эквивалент @ StephenKitt'sawk
:pattern
там интерпретируется как Базовое Регулярное Выражение, как вgrep
(в отличие от Расширенного Регулярного Выражения вawk
/egrep
/grep -E
). В некоторыхsed
реализациях есть-E
опция (BSD, ast, недавний GNU / busybox, скоро POSIX) или-r
(GNU, ssed, busybox, некоторые недавние BSD), чтобы сделать его расширенными регулярными выражениями, а некоторые имеют-P
(ast) или-R
(ssed), чтобы сделать его Perl-подобное регулярное выражение.С
perl
:источник
с GNU и * BSD grep:
Если ваш файл не содержит более 1 млн строк, вот и все.
источник
Если вы используете пейджер, например,
less
для просмотра выходных данных командыисточник
awk
для строк после (но не включая) первого совпадения с образцомЕсли строка, содержащая шаблон триггера, является эквивалентом «CUT HERE», вы можете опустить ее в выводе на печать:
Каждая строка ввода проходит через два компонента в коде awk. Первый компонент
flag
, который awk интерпретирует как «напечатать строку, если переменнаяflag
отлична от нуля». Так как переменные awk по умолчанию равны 0, изначально ничего не печатается.Второй компонент,
/pattern/ { flag=1 }
устанавливает флаг в 1, как только обнаруживает шаблон, и флаг сохраняет это значение до конца цикла.К тому времени, когда шаблон впервые обнаружен, возможность распечатать эту строку ввода уже прошла. Любые последующие строки (включая дополнительные строки, содержащие шаблон) будут напечатаны.
источник
удар
Немного неуклюже, но это работает.
Эта версия опирается на
cat
, но это легче понять.источник