Извлечение 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/'