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

Я хочу отредактировать файл bashrc, чтобы выполнить простую функцию под названием myip. Как вы могли догадаться, функция myip печатает только мой внутренний IP-адрес моей машины.

Насколько я работал, это сценарий:

ifconfig en1 | awk '{ print $2}' | sort 

Который получил мой этот выход:

 10.0.0.12 options=1 flags=8863 fe80::daa2:5eff:fe96:ba2f%en1 d8:a2:5e:96:ba:2f autoselect active 

Я работаю над Mac OS X.

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

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

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

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

Это более «агностический » способ получить 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 | 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 ... ifconfig eth0 | grep -E ...

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

  • ip route ... : ip команда не установлена ​​в машинах OSX.
  • hostname -I : параметр -I недействителен в OSX.
  • ifconfig en0 ... : имена интерфейсов ( eth0 , en0 ) различаются в Linux и OSX, а в Linux это имя также зависит от типа интерфейса ( ethX для подключения к сети Ethernet, wlanX для беспроводной сети и т. д.).
  • python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))' 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 ' ' ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' ' : пост Geograph является более близким, но не работает в некоторых дистрибутивах Linux без настройки LANG=en , поскольку текст inet addr: grep выводится с другим текстом в других локалях , а в Mac OS эта метка также отличается.

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

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

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

Вы можете использовать awk чтобы выполнить как выбор строки inet и parsing IP-адреса следующим образом:

 $ ip addr ls docker0 | awk '/inet / {print $2}' | cut -d"/" -f1 172.17.42.1 

В приведенном выше примере замените дескриптор устройства eth0 in для docker0 . Кроме того, если вы хотите реализовать чистую AWK-версию , вы можете сделать «разрезание» внутри так:

 $ ip addr ls docker0 | awk '/inet / {split($2, ary, /\//); print ary[1]}' 172.17.42.1 

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

Не нужно делать unportable ifconfig-парсинг в Bash. Это тривиальный однострочный шрифт на Python:

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

Наиболее просто:

  hostname -I|cut -d" " -f 1 192.168.1.6 

Какое это устройство?

Если вы не знаете, являются ли эти eth1, eth1, enp0s23 или wpxxx, вы можете использовать команду hostname и выяснить, какое устройство имеет это:

  ip a | awk 'BEGIN{ "hostname -I|cut -d\" \" -f 1" | getline ip} $2 ~ ip {print "Device: "$NF " IP: "$2}' 192.168.3.5 

Сетевой IP-адрес?

Теперь действительно, если вы хотите, чтобы ваш IP-адрес сети мог сделать что-то вроде этого:

  wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d \< -f1 49.21.123.14 

Если вы ищете только «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. Следовательно, вы можете изменить сценарий соответственно.

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 ' ' 

Принимая ответ патча , делая его немного более общим,

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

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-адрес.

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

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

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

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

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

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

Скрипт:

 /sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2 

Это можно присвоить переменной в скрипте следующим образом:

 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 , 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», так как это добавляет эффект фильтрации исходящих адресов, а также работает с большинством версий OS X и Linux.
  • Последняя функция «вырезания» необходима для правильной работы в Linux, но не для OS X. Однако она не влияет на результаты OS X, поэтому она оставлена ​​для переносимости.

Простой пример сценария AWK + Bash, который может дать общее представление о том, как синтаксически анализировать вывод команды и смешивать синтаксисы.

Полный код: 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 "" } } }' 

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

 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}' 
  • Как установить Autoconf, Automake и соответствующие инструменты в Mac OS X из источника?
  • Запустить сценарий оболочки на OS X без появления окна терминала?
  • Как восстановить поврежденный файл Excel
  • Почему SMART проходит, пока он указывает на ошибку для частоты ошибок чтения RAW?
  • Восстановление файлов из форматированного раздела HFS +
  • Как сделать каталог пользователей другим разделом в Snow Leopard?
  • Как отключить создание .Spotlight-V100 и .Trash папок на внешнем диске?
  • Могу ли я автоматически входить в ssh с помощью паролей из брелка OS X?
  • Изменение размера раздела Bootcamp без обтирания
  • Какова задача «java» (родительский процесс «launchd»), выполняемый на MacOS X?
  • Как использовать точный путь в диалоговом окне открытия файла Mac OS X?
  • Давайте будем гением компьютера.