Ответ 1
Хорошо, после нескольких часов борьбы я, наконец, понял:
ifconfig en1 | awk '{ print $2}' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"
Эта последняя часть, которую я потерял, - это просто grep шаблон IP-адресов из моего списка.
Я хочу отредактировать файл bashrc, чтобы выполнить простую функцию под названием myip. Как вы могли догадаться, функция myip печатает только мой внутренний IP-адрес моей машины.
Насколько я работал, это script:
ifconfig en1 | awk '{ print $2}' | sort
Который получил мой результат:
10.0.0.12
options=1<PERFORMNUD>
flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST>
fe80::daa2:5eff:fe96:ba2f%en1
d8:a2:5e:96:ba:2f
autoselect
active
Я работаю над Mac OS X.
Как я могу это сделать?
Хорошо, после нескольких часов борьбы я, наконец, понял:
ifconfig en1 | awk '{ print $2}' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"
Эта последняя часть, которую я потерял, - это просто grep шаблон IP-адресов из моего списка.
Здесь выполняются следующие работы (CentOS 5).
ip addr show eth0 | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}'
ifconfig eth0 | awk '/inet addr/ {gsub("addr:", "", $2); print $2}'
Для OS X (v10.11 (El Capitan) как минимум):
ifconfig en0 | awk '$1 == "inet" {print $2}'
Это более "агностический" способ получить IP-адрес, независимо от вашей системы * nix (Mac OS, Linux), имени интерфейса и даже вашей конфигурации локали:
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d:
Если у вас несколько активных IP-адресов, они будут перечислены в отдельной строке. Если вы хотите только первый IP-адрес, добавьте | head -n1
в выражение:
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" \
| grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1
И если вам нужен IP-адрес определенного интерфейса, замените первое выражение ifconfig
на ifconfig INTERFACENAME
, например ifconfig eth0 | grep -E ...
.
Вот некоторые примеры, упомянутые на этой странице, которые в некоторых случаях не срабатывают и почему:
ip route ...
: команда ip
не установлена в машинах OSX.hostname -I
: параметр -I
недопустим в OSX.ifconfig en0 ...
: имена интерфейсов (eth0
, en0
) различаются в Linux и OSX, а в Linux это имя также зависит от типа интерфейса (eспасибо для подключения Ethernet, wlanX для беспроводной сети и т.д.)..python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
: это привело меня к 127.0.1.1
(loopback IP) в Ubuntu Linux 14.04, поэтому не работает.ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
: пост географической публикации более близок, но не работает в некоторых дистрибутивах Linux без LANG=en
, поскольку текст inet addr:
, который ищет grep
, выводится с другим текстом в другом локалей и в Mac OS, которые также отличаются друг от друга.В случае eth0 для меня работает следующее. Попробуйте настроить его с помощью той же логики.
ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
Вы можете использовать awk
, чтобы выполнить как выбор строки inet
, так и разбор IP-адреса следующим образом:
$ ip addr ls docker0 | awk '/inet / {print $2}' | cut -d"/" -f1
172.17.42.1
В приведенном выше примере замените дескриптор устройства eth0
на docker0
. Кроме того, если вы хотите выполнить чистую AWK, вы можете сделать так, чтобы "вырезать":
$ ip addr ls docker0 | awk '/inet / {split($2, ary, /\//); print ary[1]}'
172.17.42.1
Существует еще один простой способ получить IP-адрес отдельно от разбора ifconfig.
hostname -I
-I, --all-ip-addresses all addresses for the host
-i, --ip-address addresses for the hostname
Ссылка: http://linux.die.net/man/1/hostname
Пример:
[ec2-user @terraform ~] $hostname -I
10.10.10.10
Примеры IPv4 с использованием BASH4+
Пример 1, используя имя хоста:
hostname -I|cut -d" " -f 1
Пример 2, устройство известно (и оно никогда не изменяется):
ifconfig ens5 | grep "inet" | awk '{print $2}' | sed 's/[^0-9.]*//g'
Пример 3: теперь не устройство (например, eth0, eth1, enp0s23 или wpxxx):
ip a | awk 'BEGIN{ "hostname -I|cut -d\" \" -f 1" | getline ip} $2 ~ ip {print "Device: "$NF " IP: "$2}'
Пример 4: требуется IP-адрес сети:
wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d \< -f1
наслаждаться.
Не нужно делать unportable ifconfig разбор в Bash. Это тривиальный однострочный слой в Python:
python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
Если вы ищете только "inet" , а не "inet6", это работает для меня:
/usr/bin/ifconfig eth0 | grep --word-regexp inet | awk '{print $2}'
"- word-regexp" заставит grep искать целое слово "inet" и не будет соответствовать частичным словам, т.е. "inet" не будет соответствовать "inet6" - "inet" будет соответствовать линиям с "inet" "в них.
Вы также можете попробовать это
[email protected]:~$ cat script.sh
ifconfig | grep ad.*Bc | cut -d: -f2 | awk '{ print $1}'
[email protected]:~$
Выход
[email protected]:~$ ./script.sh
192.168.1.1
10.0.1.1
[email protected]:~$
Обратите внимание, что вывод ifconfig может отличаться в зависимости от вашей версии Linux. Следовательно, вы можете соответствующим образом изменить script.
Btw, это мой вывод ifconfig
[email protected]:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:10
inet addr:192.168.1.1 Bcast:192.168.56.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:112 errors:0 dropped:0 overruns:0 frame:0
TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14616 (14.2 KiB) TX bytes:17776 (17.3 KiB)
eth1 Link encap:Ethernet HWaddr 00:00:00:00:00:11
inet addr:10.0.1.1 Bcast:10.0.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
[email protected]:~$
Аналогично JSR, но с awk
и cut
в обратном порядке:
my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print $2}' | cut -d: -f 2)
echo ${my_ip}
Это работает для меня: ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'
Код, работающий также с VDS/VPS:
ifconfig | grep -A2 "venet0:0\|eth0" | grep 'inet addr:' | sed -r 's/.*inet addr:([^ ]+).*/\1/' | head -1
или
ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
Взяв патч, сделав его более общим,
i.e: пропускать все до первой цифры.
ifconfig eth0 | awk '/inet addr/{sub(/[^0-9]*/,""); print $1}'
Или даже лучше:
ifconfig eth0 | awk '/inet /{sub(/[^0-9]*/,""); print $1}'
Использование Perl Regex:
ifconfig eth0 | grep -oP '(?<= inet addr:)[^ ]+'
Объяснение: grep -oP ищет соответствие EXACT с использованием регулярного выражения Perl.
"Трудная" часть - это регулярное выражение,
1. (?<= inet addr:)
означает, что строка inet addr:
относится к ЛЕВОЙ в том, что мы ищем.
2. [^ ]+
(обратите внимание на пробел после ^) - это означает, что нужно искать все до первого пустого - в нашем случае это IP-адрес.
Использование:
ifconfig enops3 | greb broadcast | cut -d " " -f10
Где enops3
- имя интерфейса.
Этот код выводит IP-адреса для всех сетевых подключений (кроме loopback) и переносится между большинством ОС и версиями X и Linux.
Это особенно полезно для скриптов, которые запускаются на машинах, где:
script:
/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2
Это может быть присвоено переменной в script следующим образом:
myip=$(/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2)
Сценарии могут обрабатывать возможные множественные адреса, используя цикл для обработки результатов, так:
if [[ -n $myip ]]; then
count=0
for i in $myip; do
myips[count]=$i # Or process as desired
((++count))
done
numIPaddresses=$count # Optional parameter, if wanted
fi
Примечания:
После некоторых решений я считаю это наиболее удобным, добавьте это в свой псевдоним:
alias iconfig='ifconfig | awk '\''{if ( $1 >= "en" && $2 >= "flags" && $3 == "mtu") {print $1}; if ( $1 == "inet" || $1 == "status:"){print $0};}'\''|egrep "en|lo|inet"'
вывод выглядит следующим образом:
[email protected]:xxxx/xxx ‹dev*›$ iconfig
lo0:
inet 127.0.0.1 netmask 0xff000000
en0:
inet 10.16.27.115 netmask 0xffffff00 broadcast 10.16.27.255
en1:
en2:
en5:
inet 192.168.2.196 netmask 0xffffff00 broadcast 192.168.2.255
ifconfig eth0 | awk '/inet addr/{sub("addr:",""); print $2}'
Простой пример AWK + Bash script, который может дать общее представление о том, как разбирать вывод команды и смешивать синтаксисы вместе.
Полный код: https://gist.github.com/darkphase/67d7ec22d47dbebd329e
BEGIN { RS = "" ; FS = "\n" } # Change separator characters
{
while ( "'"$cmd"'" | getline ){
# print $0
if ( $1 !~ /LOOPBACK/ ){
split($1,arr," ")
print "'"$blue"'"arr[1]"'"$reset"'"
for(i = 1; i <= NF; i++) { # Loop through fields (this case lines)
split($i,arr," ")
switch ( arr[1] ) {
case "inet":
print "'"$red"'" "IPV4:" "'"$reset"'" "\n IP: " "'"$yellow"'" arr[2] "'"$reset"'" "\n NM: "arr[4]"\n BC: "arr[6]
break
case "inet6":
print "'"$red"'" "IPV6:" "'"$reset"'" "\n IP: "arr[2]"\n PL: "arr[4]
break
case "ether":
print "'"$red"'" "MAC: " "'"$reset"'" arr[2]
break
default:
}
}
print ""
}
}
}'