Existe um script (vamos chamá-lo echoer
) que é impresso para exibir um monte de informações. Eu gostaria de poder ver apenas as linhas depois que um padrão for encontrado.
Eu imagino o uso de uma solução para parecer algo como
echoer | solution_command <pattern>
Idealmente, pattern
seria uma expressão regular, mas cadeias de valor rígidas seriam suficientes para mim.
Respostas:
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 começando com a primeira linha correspondentepattern
.O AWK é baseado em padrões e geralmente é usado com um tipo de abordagem "se esse padrão corresponder, faça isso". “Esse padrão” pode ser um intervalo de padrões, definido como “quando esse padrão corresponder, comece a fazer isso até que outro padrão corresponda”; isso é especificado escrevendo dois padrões separados por vírgula, como acima. Os padrões podem ser correspondências de texto, como em
/pattern/
, onde a linha atual é comparada com o 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 as linhas correspondentespattern
e, uma vez encontrada, aplica a ação padrão a todas as linhas até que a0
condição corresponda (seja diferente de zero).awk '/pattern/,""'
funcionaria também.O manual do Gawk entra em muito mais detalhes.
fonte
0
? Seria/pattern/,/0/
? Como seria a resposta ao escrever explicitamente a ação padrão?/pattern/,/0/
seria impresso até encontrar uma linha (registro) contendo “0”. Escrever o snippet na resposta com uma ação explícita fornece/pattern/,0 { print $0 }
ou equivalente/pattern/,0 { print }
.O
sed
equivalente obrigatório do de StephenKittawk
:pattern
é interpretada 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, recente GNU / busybox, em breve POSIX) ou-r
(GNU, ssed, busybox, algum recente BSD) para torná-lo Expressões regulares estendidas e outras têm-P
(ast) ou-R
(ssed) para torná-lo uma expressão regular semelhante a perl.Com
perl
:fonte
com GNU e * BSD grep:
A menos que seu arquivo tenha mais de 1 milhão de linhas, é isso.
fonte
Se você estiver usando um pager, como
less
para visualizar a saída do comandofonte
awk
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 é equivalente a "CORTE AQUI", você pode omiti-lo na saída impressa:
Cada linha de entrada é executada através de dois componentes no código awk. O primeiro componente é
flag
, que o awk interpreta como "imprime 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 para 1 assim que detectar o padrão, e o sinalizador mantém esse valor pelo resto da execução.Quando 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.
fonte
Bater
Um pouco desajeitado, mas funciona.
Esta versão depende
cat
, mas é mais fácil de entender.fonte