Мне нужно извлечь 2-й IP-адрес из трассировки, например, так
traceroute -m2 8.8.8.8 |grep .net |awk '{print $3}'
(111.222.333.4444)
. Что бы я ни пытался, я не могу понять, как удалить окружающие скобки из вывода.
Друг дал мне это решение, и я думал, что должен отправить его здесь, чтобы, возможно, помочь другим, имеющим подобную проблему.
traceroute -w 20 -m 2 8.8.8.8 | egrep "^ 2" | sed -r -e 's/.*\(([^)]*).*/\1/'
намного лучший способ извлечь IP-адрес из второй строки вывода traceroute вместо того, чтобы полагаться на определение местоположения "сети"
Вы не нуждаетесь 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-адресом, но без скобок Я просто использую tr -d
для удаления ряда символов, это более просто. И awk может также grep сразу:
traceroute -m 2 8.8.8.8 | awk '/.net/{print $3}' | tr -d '()'
traceroute -m2 8.8.8.8 |grep .net |awk '{print $3}' |cut -d '(' -f2 | cut -d ')' -f1
Никакая любовь к 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
\).*
соответствия все остальное после желаемой части
Сделайте:
traceroute -m2 8.8.8.8 | grep .net | awk '{print $3}' | sed -e "s/(//" -e "s/)//"
Этот ответ чрезмерно прост .
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-
первый предпочтен для этого случая, поскольку мы работаем с символами, не байты, хотя второй мог бы быть быстрее (немного, конечно), поскольку он работает непосредственно с байтами. Мы можем использовать обоих, потому что (
один байт.
Если Ваш awk позволяет regexp разделителей полей, используйте единственную команду:
awk -F'[()]' '/\.net/{print $2}'
Это разделяет вход на слова, разделенные (
или )
, таким образом, 2-е слово является IP-адресом.