Encontrando a última ocorrência de padrão na string

0

Estou tentando analisar linhas de arquivo de log para endereços IP com grep -o '[0-9] {1,3}. [0-9] {1,3}. [0-9] {1, 3}. [0-9] {1,3} 'e gostaria de extrair apenas o último endereço IP em cada linha.

Exemplo de duas linhas para analisar:

Via: SIP/2.0/UDP 78.41.207.101:5237;branch=z9hG4bK-577783956;rport=5237
Via: SIP/2.0/UDP 127.0.0.1:5079;branch=z9hG4bK-1014230957;rport=5079;received=194.126.22.146

Estou recebendo:

78.41.207.101
127.0.0.1
194.126.22.146

O que eu gostaria de obter:

78.41.207.101
194.126.22.146

Eu agradeceria sua ajuda.

    
por Orest Orestovich 25.04.2018 / 23:03

3 respostas

1

Você pode tentar este sed

sed -E 's/.*[^0-9](([0-9]{1,3}\.){3}[0-9]{1,3}).*//' infile

Explique:

-E para usar expressão regular extensa.
Sem -E você deve escrever o comando desta forma

sed 's/.*[^0-9]\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*//' infile

(([0-9] {1,3}.) {3} [0-9] {1,3}) é o mesmo RE que o seu.

<-------> !  
    1     3 time

'[0-9] {1,3}. [0-9] {1,3}. [0-9] {1,3}. [0-9] {1,3}'

< --------- > < --------- > < --------- >

   1       2       3

A primeira parte. * [^ 0-9] é gananciosa.
Combina tudo o que pode antes do último regex na linha.
O último. * Corresponde ao final da linha.

    
por 26.04.2018 / 19:43
0

Eu gosto de usar o awk em tais casos:

$ awk '{print $NF}' FPAT="[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}" file1
78.41.207.101
194.126.22.146

FPAT é usado para definir em que consiste um campo (idêntico ao padrão grep -o)
$NF é o último campo de cada linha

    
por 25.04.2018 / 23:16
0

A maioria das máquinas regexp usa padrões gananciosos, ou seja, eles combinam o máximo que podem. Então, algo como ^.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ irá corresponder até e incluindo o último endereço IPv4. Capture isso.

    
por 17.05.2018 / 20:16