Existe um script (vamos chamá-lo de echoer
) que imprime para exibir um monte de informações. Eu gostaria de poder ver apenas linhas depois que um padrão for encontrado.
Eu imagino o uso de uma solução para se parecer com
echoer | solution_command <pattern>
Idealmente pattern
seria uma expressão regular, mas strings de valor rígido seriam suficientes para mim.
O AWK pode fazer isso com intervalos de padrões, o que permite o uso de qualquer expressão regular:
imprimirá
echoer
a saída da primeira linha correspondentepattern
.O AWK é baseado em padrões e normalmente é usado com uma abordagem do tipo “se esse padrão corresponder, faça isso”. “Este padrão” pode ser um intervalo de padrões, definido como “quando este padrão corresponder, comece a fazer isso, até que este outro padrão corresponda”; isso é especificado escrevendo dois padrões separados por uma vírgula, como acima. Os padrões podem ser correspondências de texto, como em
/pattern/
, onde a linha atual é verificada em relação ao padrão, interpretada como uma expressão regular; eles também podem ser expressões gerais, avaliadas para cada linha e consideradas correspondentes se o resultado for diferente de zero ou não vazio.No AWK, a ação padrão é imprimir a linha atual.
Juntando tudo isso,
awk '/pattern/,0'
procura por linhas correspondentespattern
e, quando encontrar uma, aplica a ação padrão a todas as linhas até que a0
condição corresponda (é diferente de zero).awk '/pattern/,""'
funcionaria também.O manual do Gawk entra em muito mais detalhes.
O equivalente obrigatório
sed
do @StephenKittawk
:pattern
lá é interpretado como uma Expressão Regular Básica como emgrep
(em oposição à Expressão Regular Estendida emawk
/egrep
/grep -E
). Algumassed
implementações têm uma opção-E
(BSD, ast, GNU/busybox recente, em breve POSIX) ou-r
(GNU, ssed, busybox, algum BSD recente) para torná-lo Expressões Regulares Estendidas e algumas têm-P
(ast) ou-R
(ssed) para torná-lo uma expressão regular do tipo perl.Com
perl
:com GNU e *BSD grep:
A menos que seu arquivo tenha mais de 1 milhão de linhas, é isso.
festança
Um pouco chato, mas funciona.
Esta versão depende do
cat
, mas é mais fácil de entender.Se você estiver usando um pager como
less
para visualizar a saída do comandoawk
para linhas após (mas não incluindo) a primeira correspondência de padrãoSe a linha que contém o padrão de disparo for o equivalente a "CUT HERE", você pode omiti-la da saída impressa:
Cada linha de entrada passa por dois componentes no código awk. O primeiro componente é
flag
, que o awk interpreta como "imprimir a linha se a variávelflag
for diferente de zero". Como as variáveis awk são 0 por padrão, isso inicialmente não imprimirá nada.O segundo componente,
/pattern/ { flag=1 }
, define o sinalizador como 1 assim que detecta o padrão, e o sinalizador mantém esse valor pelo resto da execução.No momento em que o padrão é detectado pela primeira vez, a oportunidade de imprimir essa linha de entrada já passou. Quaisquer linhas subsequentes (incluindo linhas adicionais contendo o padrão) serão impressas.