Sed não dando a primeira ocorrência de padrão

1

o arquivo cat contém

 inet addr:192.168.154.102 Bcast:192.168.154.255 Mask:255.255.255.0
 inet addr:127.0.0.1 Mask:255.0.0.0

Estou extraindo o endereço ip ( 192.168.154.102 e 127.0.0.1 ) usando o sed assim:

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

mas apenas dá:

5.255.255.0
5.0.0.0
    
por munish 13.08.2013 / 14:35

4 respostas

1

Use awk :

$ echo "inet addr:192.168.154.102 Bcast:192.168.154.255 Mask:255.255.255.0" | awk '{ split($2, a, ":"); print a[2] }'
192.168.154.102

Se você precisar usar sed , por exemplo:

echo "inet addr:192.168.154.102 Bcast:192.168.154.255 Mask:255.255.255.0" | sed 's#.*addr:\([0-9.]*\).*##g'
192.168.154.102
    
por 13.08.2013 / 14:48
1

O problema é que o como uma expressão regular é o mais ágil possível e corresponde o mais rápido possível. Isso significa simplesmente que ". *" corresponderá na primeira linha "quase tudo"

inet addr:192.168.154.102 Bcast:192.168.154.255 Mask:2

e no segundo

inet addr:127.0.0.1 Mask:25

e assim imprime o que resta e o que você tem.

No seu caso, eu tentaria ser mais específico, como usar ":" como um delimitador ou algum prefixo como "addr:" ou você pode remover todos os caracteres mas não pontos e dígitos porque o endereço IPv4 consiste apenas deles. Você pode tentar este comando:

tr -cd '[0-9. ]' < YOUR_FILE

Você pode continuar processando a saída.

    
por 13.08.2013 / 14:53
1

Use

sed -n '/inet addr:/s/[^:]\+:\(\S\+\).*//p'

Tente isso na linha de comando

ifconfig | sed -n '/inet addr:/s/[^:]\+:\(\S\+\).*//p'

Resultado

192.168.154.102
127.0.0.1
    
por 13.08.2013 / 15:02
0

Se você quiser apenas determinados padrões, por que não usar

awk -F'[: ]' '/inet addr:/{ print $4}' file
    
por 13.08.2013 / 14:51

Tags