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 commandeipn'est pas installée sur les machines OSX. -
hostname -I: l'option-Iest 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=enconfiguré, parce que le texteinet addr:quegreprecherche 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