Como remover colchetes () ao redor do endereço IP da saída do traceroute

6

Eu preciso extrair o segundo endereço IP de um traceroute assim

traceroute -m2 8.8.8.8 |grep .net |awk '{print }'
(111.222.333.4444)

Não importa o que eu tente, não consigo descobrir como remover os colchetes ao redor da saída.

    
por Spud 09.05.2016 / 00:43

8 respostas

1

Um amigo me deu essa solução e eu pensei que deveria postar aqui para ajudar os outros a ter um problema parecido.

traceroute -w 20 -m 2 8.8.8.8 | egrep "^ 2" | sed -r -e 's/.*\(([^)]*).*//'

É uma maneira muito melhor de extrair o endereço IP da segunda linha da saída do traceroute, em vez de depender da localização de "net"

    
por Spud 13.05.2016 / 13:30
9

Você não precisa de grep entre, use o recurso de correspondência de padrões do AWK.

$ traceroute -m 2 8.8.8.8 | awk '/net/{gsub(/\(|\)/,"");print }'             
207.225.112.2
  • /net/ corresponde a linhas com a palavra net
  • gsub( /\(|\)/ , "" ) corresponde a ( ou ) e substitui-os por cadeia vazia (eliminando efetivamente).
  • print imprime o terceiro item que ainda é o endereço IP, mas sem colchetes
por Sergiy Kolodyazhnyy 09.05.2016 / 00:48
3

Faça:

traceroute -m2 8.8.8.8 | grep .net | awk '{print }' | sed -e "s/(//" -e "s/)//"
    
por Videonauth 09.05.2016 / 00:48
2

Não adora grep / sed ?

  • grep com PCRE ( -P ):

    traceroute -m 2 8.8.8.8 | grep -Po '\.net[^(]+\(\K[^)]+(?=\))'
    
    • \.net[^(]+\( corresponde à parte anterior a ( e \K descarta a correspondência

    • [^)]+ macthes nossa parte desejada dentro de () e zero largura positiva antecipada (?=\)) garante que a parte seja seguida por )

  • sed com lógica semelhante:

    traceroute -m 2 8.8.8.8 | sed -nr 's/.*\.net[^(]+\(([^)]+)\).*//p' 
    
    • .*\.net[^(]+\( corresponde a tudo antes de (

    • ([^)]+) é nossa parte desejada no primeiro grupo correspondente, nós a usaremos em substituição como

    • \).* corresponde a todo o resto após a parte desejada

por heemayl 09.05.2016 / 05:34
2

Eu simplesmente uso tr -d para remover um conjunto de caracteres, é mais simples. E awk também pode grep de uma só vez:

traceroute -m 2 8.8.8.8 | awk '/.net/{print }'  |  tr -d '()'
    
por MoonCactus 09.05.2016 / 14:07
1
traceroute -m2 8.8.8.8 |grep .net |awk '{print }' |cut -d '(' -f2 | cut -d ')' -f1 
    
por PKumar 09.05.2016 / 01:11
1

Se o seu awk permitir separadores de campos regexp, use o comando único:

awk -F'[()]' '/\.net/{print }'

Isso divide a entrada em palavras separadas por ( ou ) , então a segunda palavra é o endereço IP.

    
por meuh 09.05.2016 / 08:03
1
  

Esta resposta é excessivamente simples .

traceroute -m2 8.8.8.8 |grep .net |awk '{print }'|cut -f1 -d) -c2-

ou

traceroute -m2 8.8.8.8 |grep .net |awk '{print }'|cut -f1 -d) -b2-

O primeiro é preferido para este caso, já que estamos trabalhando com caracteres, não com bytes, embora o segundo possa ser mais rápido (um pouco, é claro), já que ele trabalha diretamente com bytes. Podemos usar os dois, porque ( é um byte.