Извлечение IP-адреса из строки из вывода ifconfig с помощью grep

Учитывая эту конкретную строку, вытащенную из ifconfig, в моем случае:

inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.255

Как можно извлечь часть 192.168.2.13 (локальный IP-адрес), предположительно с помощью регулярного выражения?

Ответы

Ответ 1

Здесь один из способов: grep:

line='inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

Результаты:

192.168.2.13
192.168.2.256

Если вы хотите выбрать только действительные адреса, вы можете использовать:

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"

Результаты:

192.168.0.255

В противном случае просто выберите нужные поля, используя awk, например:

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | awk -v OFS="\n" '{ print $2, $NF }'

Результаты:

192.168.0.255
192.168.2.256


Приложение:

Границы слов: \b

Ответ 2

используйте это регулярное выражение ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?=\s*netmask)

Ответ 3

Просто добавьте альтернативный способ:

ip addr | grep -Po '(?!(inet 127.\d.\d.1))(inet \K(\d{1,3}\.){3}\d{1,3})' 

он распечатает все IP-адреса, кроме локального.

Ответ 4

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

Ответ 5

вы можете использовать egrep (который в основном такой же, как grep -E)
в egrep называются группы для классов символов, например: "digit"
(что делает команду дольше в этом случае - но вы получите точку...)

еще одна вещь, которая хороша для вас, заключается в том, что вы можете использовать скобки для повторить шаблон

ifconfig | egrep '([0-9]{1,3}\.){3}[0-9]{1,3}'

или

ifconfig | egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'


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

ifconfig | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

... и если вы не хотите адреса BCast, и вы можете использовать этот grep:

ifconfig | egrep -o 'addr:([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | egrep -o '[[:digit:]].*'

Я предположил, что вы говорили только о адресах IPv4

Ответ 6

Один способ использования sed. Первая инструкция удаляет все символы до первой цифры в строке, а вторая команда сохраняет первый IP-адрес в группе 1 (\1) и заменяет все строки следующим образом:

sed -e 's/^[^0-9]*//; s/\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/'

Ответ 7

Этот код работает хорошо и легко.

ifconfig | grep Bcast > /tmp/ip1
cat /tmp/ip1 | awk '{ print $2 }' > /tmp/ip2
sed -i 's/addr://' /tmp/ip2
IPADDRESS=$(cat /tmp/ip2)
echo "$IPADDRESS"

Ответ 8

У меня недостаточно очков репутации для комментариев, но я нашел ошибку в регулярном выражении "Выбрать только действительные адреса". Я не совсем понимаю проблему, но я считаю, что нашел исправление. Первая команда демонстрирует ошибку; второй демонстрирует исправление:

$ echo "test this IP: 200.1.1.1" |grep -oE "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
$ echo "test this IP: 200.1.1.1" |grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
200.1.1.1
$

Ответ 9

возможно, это одна команда sed, только для спорта:

    ip -o -4 addr show dev eth0 | sed 's/.* inet \([^/]*\).*/\1/'