Parse ifconfig pour obtenir seulement mon adresse IP en utilisant Bash

je veux éditer le fichier bashrc pour avoir une simple fonction appelée "myip" à exécuter. Comme vous pouvez le deviner, la fonction myip n'imprime que mon adresse IP interne de ma machine.

autant que j'ai pu travailler, c'est le script:

ifconfig en1 | awk '{ print }' | sort

qui a obtenu mon cette sortie:

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

je travaille sur Mac OS X.

Comment faire?

13
demandé sur Peter Mortensen 2014-05-29 17:23:09

19 réponses

les deux travaux suivants ici (CentOS 5).

ip addr show eth0 | awk ' == "inet" {gsub(/\/.*$/, "", ); print }'

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

pour OS X ( v10.11 (El Capitan) au moins):

ifconfig en0 | awk ' == "inet" {print }'
22
répondu Etan Reisner 2016-03-25 13:56:55

dans le cas de eth0, les travaux suivants pour moi. Essayer de ruser avec la même logique.

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print }'  
12
répondu JSR 2016-03-25 13:57:45

C'est le plus "agnostic "façon d'obtenir l'adresse IP, indépendamment de vous *nix système (Mac OS, Linux), nom de l'interface, et même votre configuration locale:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print  }' | cut -f2 -d:

si vous avez plus d'une IP active, énumérera chacune dans une ligne séparée. Si vous voulez juste la première adresse IP, ajoutez | head -n1 à l'expression:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" \
     | grep -v 127.0.0.1 | awk '{ print  }' | cut -f2 -d: | head -n1

Et si vous voulez l'adresse IP d'une interface spécifique, remplacer la première expression ifconfig par ifconfig INTERFACENAME , par exemple ifconfig eth0 | grep -E ... .

ce sont quelques exemples mentionnés dans cette page qui échoue dans certaines circonstances et pourquoi:

  • ip route ... : la commande ip n'est pas installée sur les machines OSX.
  • hostname -I : l'option -I est invalide dans OSX.
  • ifconfig en0 ... : les noms des interfaces ( eth0 , en0 ) sont différents dans Linux et OSX, et dans Linux le nom dépend aussi du type d'interface ( ethX pour la connexion ethernet, wlanX pour sans fil, etc.).
  • python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))' : cela m'a valu 127.0.1.1 (un loopback IP ) dans Ubuntu Linux 14.04, donc ne fonctionne pas.
  • ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' ' : le message du géographe est le plus proche, mais ne fonctionne pas dans certaines distributions Linux sans LANG=en configuré, parce que le texte inet addr: que grep recherche est sortie avec un texte différent dans d'autres locales, et dans Mac OS que l'étiquette est également différente.
12
répondu Mariano Ruiz 2016-05-13 14:29:14

Eh bien, après des heures de lutte j'ai finalement eu raison:

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

la dernière partie qui me manquait est juste un motif d'adresses IP de ma liste.

7
répondu Fernando Retimo 2016-03-25 13:58:24

vous pouvez utiliser awk pour faire à la fois la sélection de la ligne inet et l'analyse de l'adresse IP comme ainsi:

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

dans l'exemple ci-dessus, remplacer docker0 par eth0 . En outre, si vous voulez une pure AWK mise en œuvre, vous pouvez faire la "coupe" à l'intérieur comme ainsi:

$ ip addr ls docker0 | awk '/inet / {split(, ary, /\//); print ary[1]}'
172.17.42.1
7
répondu slm 2016-03-25 13:59:30

Il y a un autre moyen facile d'obtenir l'adresse IP en dehors de l'analyse ifconfig.

hostname -I -I, --all-ip-addresses all addresses for the host -i, --ip-address addresses for the hostname

Réf: http://linux.die.net/man/1/hostname

exemple:

[ec2-utilisateur@terraform ~]$ hostname -je

10.10.10.10

3
répondu Baskar 2015-12-18 16:46:14

Pas besoin de faire de portables ifconfig l'analyse en Bash. C'est un one-liner trivial en Python:

python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
2
répondu John Zwinck 2014-05-29 13:36:23

plus simplement:

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

C'est quel appareil?

si vous ne savez pas si c'est eth0, eth1, enp0s23, ou wpxxx, vous pouvez utiliser la commande hostname et trouver quel périphérique l'a:

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

adresse IP du réseau?

maintenant vraiment si vous voulez votre adresse IP réseau vous pouvez faire quelque chose comme ceci:

 wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d \< -f1
 49.21.123.14
2
répondu Mike Q 2016-03-25 14:07:40

si vous cherchez juste "inet" et non "inet6", cela fonctionne pour moi:

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

"--mot-regexp" fera grep chercher le mot entier "inet" et de ne pas correspondre partiels des mots, c'est à dire "inet" ne correspond pas "inet6" - "inet" ne fait correspondre les lignes avec "inet".

1
répondu Jonathan Le 2015-02-23 21:26:43

vous pouvez également essayer ce

user@linux:~$ cat script.sh
ifconfig | grep ad.*Bc | cut -d: -f2 | awk '{ print }'
user@linux:~$ 

sortie

user@linux:~$ ./script.sh
192.168.1.1
10.0.1.1
user@linux:~$

veuillez noter que la sortie ifconfig peut être différente selon votre version linux. Par conséquent, vous pourriez vouloir modifier le script en conséquence.

Btw, c'est ma sortie ifconfig

user@linux:~$ 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)

user@linux:~$
1
répondu Charlotte Russell 2017-06-14 13:52:44

similaire à JSR, mais avec awk et cut dans l'ordre inverse:

my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print }' | cut -d: -f 2)
echo ${my_ip}
0
répondu Arun 2015-08-08 00:41:48

ça marche pour moi:

ifconfig eth0 | awk '/inet addr/{print substr(,6)}'

0
répondu user3396065 2015-09-25 08:32:05

Code de travail sur VDS/VPS trop:

ifconfig | grep -A2 "venet0:0\|eth0" | grep 'inet addr:' | sed -r 's/.*inet addr:([^ ]+).*//' | head -1

ou

ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
0
répondu Geograph 2015-10-18 06:10:33

Prendre patch en réponse, le rendant un peu plus général,

c'est-à-dire: tout sauter jusqu'au premier chiffre.

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

ou même mieux:

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

  • s'il vous Plaît noter la imprimer à la fin - les modifications de $2 à $1 .

Utilisant Perl Regex:

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

Explication: grep -oP rechercher une correspondance EXACTE à l'aide de regex Perl.

La partie" délicate "est le regex lui-même;

1. (?<= inet addr:) signifie que la chaîne inet addr: est à gauche de ce que nous cherchons.

2. [^ ]+ (s'il vous plaît noter l'espace après le ^ ) - Il signifie de chercher tout jusqu'à ce que le premier blanc - dans notre cas, C'est L'adresse IP.

0
répondu AK75 2016-02-22 18:02:16

utiliser:

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

enops3 est le nom de l'interface.

0
répondu Khalid Abdlqader 2016-03-25 14:00:27

ce code affiche les adresses IP pour toutes les connexions réseau (sauf loopback) et est portable entre la plupart OS X et Linux versions .

c'est particulièrement utile pour les scripts qui tournent sur des machines où:

  • l'adaptateur réseau actif est inconnu,
  • les ordinateurs portables qui basculent entre les connexions Wi-Fi et Ethernet, et
  • machines avec plusieurs connexions réseau.

le script est:

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

cela peut être assigné à une variable dans un script comme celui-ci:

myip=$(/sbin/ifconfig -a | awk '/(cast)/ {print }' | cut -d: -f2)
Les Scripts

peuvent gérer plusieurs adresses possibles en utilisant une boucle pour traiter les résultats, comme suit:

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

Notes:

  • filtres "ifconfig" sur le "cast", comme cela a un effet supplémentaire de filtrage des adresses loopback tout en travaillant sur la plupart des versions D'OS X et Linux.
  • la fonction finale 'cut' est nécessaire pour une fonction correcte sur Linux, mais pas sur OS X. Cependant, elle n'affecte pas les résultats OS X - donc elle est laissée pour la portabilité.
0
répondu azrobbo 2016-03-25 14:03:50

un exemple simple de script AWK + Bash qui peut donner une idée générale de la façon de traiter la sortie des commandes et de mélanger les syntaxes.

le code complet est à: https://gist.github.com/darkphase/67d7ec22d47dbebd329e

BEGIN { RS = "" ; FS = "\n" }  # Change separator characters
{
    while ( "'"$cmd"'" | getline ){
        # print "151900920"
        if (  !~ /LOOPBACK/ ){

            split(,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 ""
        }
    }
}'
0
répondu darkphas 2016-03-25 14:06:30

après avoir essayé quelques solutions, je trouve cela très pratique, ajoutez ceci à votre alias:

alias iconfig='ifconfig | awk '\''{if (  >= "en" &&  >= "flags" &&  == "mtu") {print }; if (  == "inet" ||  == "status:"){print "151900920"};}'\''|egrep "en|lo|inet"'

la sortie ressemble à ceci:

shady@Shadys-MacBook-Pro: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

0
répondu Shadycorp 2016-03-29 08:49:47
ifconfig eth0 | awk '/inet addr/{sub("addr:",""); print }'
-1
répondu patch 2015-10-23 22:38:35