Grep para a ocorrência mais próxima da linha antes do padrão

0

Eu gostaria de pesquisar o arquivo com o GREP para o "User-Agent: UA" e extrair a linha mais próxima acima que tem "Via:" Meu problema é que às vezes há várias linhas com "Via:", mas Eu só preciso de um último.

Por exemplo, arquivo a analisar:

Via: 1.1.1.1  
not relevant line  
...
not relevant line N
User-Agent: UA
...
Via: 2.2.2.2
Via: 3.3.3.3
not relevant line
...
not relevant line N
User-Agent: UA
...
Via: 4.4.4.4
Via: 5.5.5.5
Via: 6.6.6.6
not relevant line
...
not relevant line N
User-Agent: UA

Resultado eu quero é as linhas que contêm "Via:" mais próximo de "User-Agent: UA"

Via: 1.1.1.1
Via: 3.3.3.3
Via: 6.6.6.6

Qualquer ajuda será apreciada.

    
por Orest Orestovich 27.05.2016 / 16:29

2 respostas

4

Você poderia fazer isso com awk da seguinte forma:

 awk '/Via/ {via_line=$0} /User-Agent: UA/ {print via_line}' input_file

, então vamos encontrar cada linha que contém Via e armazenar essa linha, sobrescrevendo qualquer linha anterior, e quando encontrarmos a linha User-Agent: UA , imprima o que tivermos armazenado para as linhas Via .

    
por 27.05.2016 / 16:37
2

com sed:

sed -n '/^Via/h;/^User-Agent: UA$/{g;p;}' file

Saída:

Via: 1.1.1.1  
Via: 3.3.3.3
Via: 6.6.6.6

Suprima a impressão automática de espaço de padrão com -n . Se uma linha começar com Via copiar espaço de padrão para manter espaço ( h ). Isso substitui o espaço de espera. Se uma linha contiver espaço "Copiar User-Agent: UA", preencha o espaço para o espaço padrão ( g ) e imprima o espaço do padrão ( p ).

    
por 28.05.2016 / 00:30

Tags