Как убрать скобки () вокруг IP-адреса из вывода traceroute

Мне нужно извлечь 2-й IP-адрес из трассировки, например, так

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

. Что бы я ни пытался, я не могу понять, как удалить окружающие скобки из вывода.

6
задан 10 May 2016 в 21:14

8 ответов

Друг дал мне это решение, и я думал, что должен отправить его здесь, чтобы, возможно, помочь другим, имеющим подобную проблему.

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

намного лучший способ извлечь IP-адрес из второй строки вывода traceroute вместо того, чтобы полагаться на определение местоположения "сети"

1
ответ дан 11 May 2016 в 07:14
  • 1
    Моя проблема состоит в том, что даже после переключения назад на Xorg, у меня все еще есть проблема задержки, но у меня больше нет проблемы мыши – vinid223 26 October 2017 в 14:56

Вы не нуждаетесь grep промежуточный, используете возможность сопоставления с образцом AWK.

$ traceroute -m 2 8.8.8.8 | awk '/net/{gsub(/\(|\)/,"");print $3}'             
207.225.112.2
  • /net/ строки соответствий с соответствиями Word net
  • gsub( /\(|\)/ , "" ) ( или ) и заменяет их пустой строкой (эффективно удаляющий).
  • print $3 печать 3-й объект, который является все еще IP-адресом, но без скобок
9
ответ дан 11 May 2016 в 07:14

Я просто использую tr -d для удаления ряда символов, это более просто. И awk может также grep сразу:

traceroute -m 2 8.8.8.8 | awk '/.net/{print $3}'  |  tr -d '()'
3
ответ дан 11 May 2016 в 07:14
traceroute -m2 8.8.8.8 |grep .net |awk '{print $3}' |cut -d '(' -f2 | cut -d ')' -f1 
1
ответ дан 11 May 2016 в 07:14
  • 1
    Спасибо! Это устранило мою проблему на UbuntuStudio 16.04 с xfce, так большинство решений для GNOME didn' t применяются. Можете Вы описывать what' s причина для этого, и что делает эта фиксация? – Alex Monras 25 March 2018 в 02:56

Никакая любовь к grep/sed?


  • grep с PCRE (-P):

    traceroute -m 2 8.8.8.8 | grep -Po '\.net[^(]+\(\K[^)]+(?=\))'
    
    • \.net[^(]+\( соответствует части прежде ( и \K отбрасывает соответствие

    • [^)]+ macthes наша желаемая часть в () и нулевая ширина положительное предвидение (?=\)) гарантирует, что часть сопровождается )


  • sed с подобной логикой:

    traceroute -m 2 8.8.8.8 | sed -nr 's/.*\.net[^(]+\(([^)]+)\).*/\1/p' 
    
    • .*\.net[^(]+\( соответствия все прежде (

    • ([^)]+) наша желаемая часть в первой подобранной группе, мы будем использовать ее в замене как \1

    • \).* соответствия все остальное после желаемой части

2
ответ дан 11 May 2016 в 07:14

Сделайте:

traceroute -m2 8.8.8.8 | grep .net | awk '{print $3}' | sed -e "s/(//" -e "s/)//"
3
ответ дан 11 May 2016 в 07:14

Этот ответ чрезмерно прост .

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

или

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

первый предпочтен для этого случая, поскольку мы работаем с символами, не байты, хотя второй мог бы быть быстрее (немного, конечно), поскольку он работает непосредственно с байтами. Мы можем использовать обоих, потому что ( один байт.

1
ответ дан 11 May 2016 в 07:14
  • 1
    Спасибо за информацию, но как я сказал в своем вопросе I' ve, уже переключенный от Уэйленда до Xorg – vinid223 26 October 2017 в 14:55

Если Ваш awk позволяет regexp разделителей полей, используйте единственную команду:

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

Это разделяет вход на слова, разделенные ( или ), таким образом, 2-е слово является IP-адресом.

1
ответ дан 11 May 2016 в 07:14

Другие вопросы по тегам:

Похожие вопросы: