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?
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 }'
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 }'
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 commandeip
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 valu127.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 sansLANG=en
configuré, parce que le texteinet addr:
quegrep
recherche est sortie avec un texte différent dans d'autres locales, et dans Mac OS que l'étiquette est également différente.
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.
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
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
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()))'
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
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".
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:~$
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}
ça marche pour moi:
ifconfig eth0 | awk '/inet addr/{print substr(,6)}'
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 ' '
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.
utiliser:
ifconfig enops3 | greb broadcast | cut -d " " -f10
où enops3
est le nom de l'interface.
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é.
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 ""
}
}
}'
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