Разберите ifconfig, чтобы получить только мой IP-адрес, используя Bash

Я хочу отредактировать файл 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.

Как я могу это сделать?

Ответ 1

Хорошо, после нескольких часов борьбы я, наконец, понял:

ifconfig en1 | awk '{ print $2}' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"

Эта последняя часть, которую я потерял, - это просто grep шаблон IP-адресов из моего списка.

Ответ 2

Здесь выполняются следующие работы (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}'

Ответ 3

Это более "агностический" способ получить 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, которые также отличаются друг от друга.

Ответ 4

В случае eth0 для меня работает следующее. Попробуйте настроить его с помощью той же логики.

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'  

Ответ 5

Вы можете использовать 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

Ответ 6

Существует еще один простой способ получить 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

Ответ 7

Примеры 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

наслаждаться.

Ответ 8

Не нужно делать unportable ifconfig разбор в Bash. Это тривиальный однострочный слой в Python:

python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'

Ответ 9

Если вы ищете только "inet" , а не "inet6", это работает для меня:

/usr/bin/ifconfig eth0 | grep --word-regexp inet | awk '{print $2}'

"- word-regexp" заставит grep искать целое слово "inet" и не будет соответствовать частичным словам, т.е. "inet" не будет соответствовать "inet6" - "inet" будет соответствовать линиям с "inet" "в них.

Ответ 10

Вы также можете попробовать это

[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]:~$

Ответ 11

Аналогично JSR, но с awk и cut в обратном порядке:

my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print $2}' | cut -d: -f 2)
echo ${my_ip}

Ответ 12

Это работает для меня:
ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

Ответ 13

Код, работающий также с 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 ' '

Ответ 14

Взяв патч, сделав его более общим,

i.e: пропускать все до первой цифры.

ifconfig eth0 | awk '/inet addr/{sub(/[^0-9]*/,""); print $1}'

Или даже лучше:

ifconfig eth0 | awk '/inet /{sub(/[^0-9]*/,""); print $1}'

  • Обратите внимание, что часть печати в конце - изменяется от $2 до $1.

Использование Perl Regex:

ifconfig eth0 | grep -oP '(?<= inet addr:)[^ ]+'

Объяснение: grep -oP ищет соответствие EXACT с использованием регулярного выражения Perl.
"Трудная" часть - это регулярное выражение,

1. (?<= inet addr:) означает, что строка inet addr: относится к ЛЕВОЙ в том, что мы ищем.
2. [^ ]+ (обратите внимание на пробел после ^) - это означает, что нужно искать все до первого пустого - в нашем случае это IP-адрес.

Ответ 15

Использование:

ifconfig enops3 | greb broadcast | cut -d " " -f10

Где enops3 - имя интерфейса.

Ответ 16

Этот код выводит IP-адреса для всех сетевых подключений (кроме loopback) и переносится между большинством ОС и версиями X и Linux.

Это особенно полезно для скриптов, которые запускаются на машинах, где:

  • Активный сетевой адаптер неизвестен,
  • ноутбуки, которые переключаются между соединениями Wi-Fi и Ethernet и
  • машины с несколькими сетевыми подключениями.

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

Примечания:

  • Он фильтрует "ifconfig" на "cast", так как это добавляет эффект отфильтрования адресов loopback, а также работает с большинством версий ОС и X и Linux.
  • Последняя функция "cut" необходима для правильной работы в Linux, но не для OS X. Однако это не влияет на результаты OS X, поэтому он остался для переносимости.

Ответ 17

После некоторых решений я считаю это наиболее удобным, добавьте это в свой псевдоним:

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

Ответ 18

ifconfig eth0 | awk '/inet addr/{sub("addr:",""); print $2}'

Ответ 19

Простой пример 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 ""
        }
    }
}'