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

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

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

Независимо от того, что я пытаюсь, я не могу понять, как удалить окружающие скобки из вывода. [ ! d1]

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

7 ответов

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

$ traceroute -m 2 8.8.8.8 | awk '/net/{gsub(/\(|\)/,"");print $3}'             
207.225.112.2
/net/ соответствует строкам со словом net gsub( /\(|\)/ , "" ) соответствует ( или [ f7] и заменяет их пустой строкой (эффективно удаляя). print $3 печатает третий элемент, который все еще является IP-адресом, но без скобок
9
ответ дан 23 May 2018 в 11:18

Do:

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

Нет любви к grep / sed?

grep с PCRE (-P):
traceroute -m 2 8.8.8.8 | grep -Po '\.net[^(]+\(\K[^)]+(?=\))'
\.net[^(]+\( соответствует части до [ f8] и \K отбрасывает совпадение [^)]+, в котором находится желаемая часть внутри (), а положительный результат с нулевой шириной (?=\)) гарантирует, что за участком следует )
[d11 ] grep с помощью PCRE (-P):
traceroute -m 2 8.8.8.8 | grep -Po '\.net[^(]+\(\K[^)]+(?=\))'
\.net[^(]+\( соответствует части до ( и \K отбрасывает совпадение [^)]+, вносит желаемую часть в () и положительную нулевую ширину lookahead (?=\)) гарантирует, что за участком следует )
2
ответ дан 23 May 2018 в 11:18

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

traceroute -m 2 8.8.8.8 | awk '/.net/{print $3}'  |  tr -d '()'
2
ответ дан 23 May 2018 в 11:18
[F1]
1
ответ дан 23 May 2018 в 11:18

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

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

Это разделяет входные слова на слова, разделенные символами ( или ), поэтому второе слово - это ip-адрес .

1
ответ дан 23 May 2018 в 11:18
Этот ответ слишком прост.
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-

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

1
ответ дан 23 May 2018 в 11:18

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

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