Como imprimo a linha apenas com a última ocorrência de um regex?

0

Eu tenho um arquivo (grande) que tem várias ocorrências da expressão SCF Done e estou (por enquanto) interessado apenas na última dessas linhas. Atualmente estou usando um comando canalizado:

sed -n '/SCF Done/p' <filename> | sed '$!d'

Eu gostaria de substituir esse comando combinando-o de alguma forma, mas ainda não consegui. Especificamente, quero que o <filename> seja o último. Existe uma maneira de fazer isso?

Embora eu prefira uma solução com sed, estou aberto a outras ferramentas de linha de comando.

    
por Martin - マーチン 02.03.2015 / 07:32

2 respostas

2

Em geral, cada comando sed trabalha com os mesmos dados de origem e eles não vêem os demais. Isso não é um problema ao usar o shell para canalizar as coisas. Se você não quiser usar o shell na saída do pipe, deverá usar o buffer de retenção.

Isso deve fazer o que você quiser:

 sed '/SCF Done/h;g;$!d' <filename>

Isso coloca cada correspondência no buffer de retenção (o h ). Em seguida, depois de ler o arquivo inteiro, ele lê o buffer de retenção (o g ) e imprime apenas a última linha (o $!d ).

Eu acho que isso poderia ser otimizado ainda mais se você pudesse descobrir como obtê-lo para realmente substituir todo o buffer em cada mach, mas deixei de corrigi-lo como um exercício para você. Isso também permitirá que você se livre da parte ;$!d .

    
por 02.03.2015 / 08:35
-1

Para imprimir apenas a (s) última (s) linha (s), canalize-o em tail -n num_lines

Por exemplo, para obter apenas a última linha

sed -n '/SCF Done/p' <filename> | sed '$!d' | tail -n 1

    
por 02.03.2015 / 08:00