2012-09-21 31 views
7

Estoy tratando de escribir un script bash para obtener todas las direcciones IP en un servidor. El script debería funcionar en todas las distribuciones principales. Aquí es lo que tengo:Script Bash para obtener todas las direcciones IP

ifconfig | grep 'inet addr:' | awk {'print $2'} 

El resultado es:

addr:10.1.2.3 
addr:50.1.2.3 
addr:127.0.0.1 

¿Cómo puedo eliminar primero el prefijo addr:? En segundo lugar, ¿cómo puedo excluir 127.0.0.1?

+0

no estoy seguro si mi respuesta es de ayuda para usted, pero ¿sabe cómo acelerar mi pequeño script a continuación? - duraría al menos 5 horas para pasar. – dschinn1001

Respuesta

7

No hay necesidad de grep . He aquí una forma usando awk:

lista única addr:

ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }' 

dispositivo de la lista y addr:

ifconfig | awk -v RS="\n\n" '{ for (i=1; i<=NF; i++) if ($i == "inet" && $(i+1) ~ /^addr:/) address = substr($(i+1), 6); if (address != "127.0.0.1") printf "%s\t%s\n", $1, address }' 
+0

¿Qué tan difícil sería conseguir el 'device' eth0, eth1, etc., junto con la dirección ip? – Justin

+0

Cambiaría la parte 'awk' de esta manera:' ifconfig | awk -F "[:] +" '/ inet addr:/&& $ 4! = "127.0.0.1" {print $ 4}' '(si no es obligatorio) --- También puedes usar' -F ": | + "' como un delimitador. – Yaron

-1
ifconfig | grep 'inet addr:' | awk {'print $2'} | cut -d ":" -f 2 
+0

Solo publicar una línea de código no es útil. Debe explicar lo que hace su línea y por qué cree que es la respuesta correcta. –

0

Uso -v grep para ignorar 127.0.0.1

ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1' 

usar sed para editar el 'addr:'

ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1' | sed -e 's/addr://' 
+0

Puede usar 'awk' para filtrar la dirección de bucle invertido. – Yaron

0

ifconfig | grep 'inet addr:' | awk {'print $2'} | awk 'BEGIN{FS=":"}{print $2}' | grep -v '127.0.0.1'

12

ifconfig se obsoleto en ip. También tiene el indicador -o que escribe salidas fáciles de analizar. Use ip -4 para mostrar solo direcciones IPV4. Tenga en cuenta la secuencia de comandos simple, ya excluye la dirección de bucle:

ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {print $2" "$4}' 

O si no desea que las redes:

ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {gsub("/", " "); print $2" "$4}' 
+1

Quizás 'gsub (/\/.*/ ,"" ,$ 4)'? – ony

+1

'ip -o addr show scope global | awk '{gsub (/\/.*/, "", $ 4); imprimir $ 4} '' – h0tw1r3

+2

ifconfig o ip? ¿Por qué no simplemente usar 'hostname -I'? –

1

Aquí es un script similar a lo que he probado para obtener una ip -range de direcciones, pero es lento - alguien podría dar una pista, ¿cómo acelerar esto? (La ip-rango aquí es un ejemplo para conseguir todas las líneas, que parece ser de hasta - entre Vancouver y Corea):!

#/bin/bash

por la PI {209 .. 210}. {125..206}. {5..231}. {} 65..72 # cualquier IP 209.126.230.71 y entre 210.205.6.66

hacer

printf '===% s === \ n '"$ ip"

whois "$ ip" >> /home/$user/test001.txt

hecho

Si esto es demasiado trivial o algún error en ella aquí, sólo tiene que responder o comentario.

Este script durará hasta terminar unas 5 a 8 horas.

1

Esto es simplemente una destilación de varias respuestas y comentarios anteriores. Muestra de salida está incluido.

lista Para IPs:

Usando ip:

(restringido a IPv4 y global)

$ /sbin/ip -4 -o addr show scope global | awk '{gsub(/\/.*/,"",$4); print $4}' 
192.168.82.134 
138.225.11.92 
138.225.11.2 

Usando ifconfig:

(127.0.0.1 Excluyendo)

$ /sbin/ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }' 
192.168.82.134 
138.225.11.92 
138.225.11.2 

Para asignar direcciones IP a nombres de host, consulte this answer.

0

Es una solución muy complicado pero funciona:

ip a | awk ' !/[0-9]+\: lo/ && /^[0-9]\:/ || /inet/&& !/127\.0\.0\.1/ {print $2}'

Salida:

eth0: 192.168.0.1/24

Mejor aún:

ip a | awk ' !/[0-9]+\: lo/ && /^[0-9]\:/ || /inet/&& !/127\.0\.0\.1/ {print $2}' | perl -i -pe "s/:\n/: /g;" -pe "s/\/[\d]+$//"

Salida:

eth0: 192.168.0.1

no tengo una máquina con varias interfaces de bucle invertido no puedo comprobarlo con, no dude en enviar sus hallazgos.

0

si es sólo el "dir:" palabra que desea eliminar Me gustaría utilizar en lugar de sedawk como

ifconfig | grep 'inet addr:' | awk {'print $2'}| grep -v 127.0.0.1 | sed -e 's/addr://' 
0

siempre estoy sorprendido de ver gente usando sed y awk en lugar de perl.

Pero en primer lugar, utilizando tanto grep y awk con una opción adicional, no dude en solo:

ifconfig | grep 'inet addr:' | awk {'print $2'} | awk -F: {'print $2'} | grep -v '127.0.0.1' 

sustitución de los awks con el Perl:

ifconfig | grep 'inet addr:' | perl -F\\s\|: -ane 'print "$F[2]\n"' | grep -v '127.0.0.1' 

sustitución de los greps dentro del mismo script de perl :

ifconfig | perl -F\\s\|: -ane 'next if !/^inet addr:/ or /127\.0\.0\.1/; print "$F[2]\n"' 

y, por último, simplemente usando el poder de expresiones regulares de perl:

ifconfig | perl -ne 'next if !/inet addr:(?<ip>[0-9.]+)/ or $+{ip} == "127.0.0.1"; print "$+{ip}\n"' 
2

Simplemente usando hostname se puede obtener una lista de todas las direcciones IP, utilizando la bandera -I.

i.e.

$ hostname --all-ip-addresses || hostname -I 
10.10.85.100 10.20.85.100 10.30.85.100 

mientras que

$ hostname --ip-address || hostname -i 
::1%1 127.0.0.1 

Centos7 (k3.10.0)

+0

La página de manual advierte 'No haga suposiciones sobre el orden de la salida. Eso no importa en el alcance de la pregunta, pero podría importar si desea usar la primera IP en el salida y asumir que es eth0. – jimp

0

lo haría para presentarle a una herramienta de línea de comandos llamada OSQuery por Facebook, que le ayuda a obtener información del sistema al hacer Consultas similares a SQL. Para su caso, por ejemplo, habría ingresado;

osquery> select * from interface_addresses; 

Que produciría algo así como;

interface = wlan0 
     address = 192.168.0.101 
      mask = 255.255.255.0 
    broadcast = 192.168.0.255 
point_to_point = 

Que me parece mucho más ordenado y conveniente.

Cuestiones relacionadas