Hola a todos!
Estoy iniciándome en esto de los scripts en bash y tengo una duda que seguro que es muys encilla de solucionar pero que por más vueltas que doy no he visto como solucionarlo.
Lo que quiero es saber como almacenar en una variable el string de una salida por pantalla de cualuqier comando.
Se que para guardar esa una salida en un archivo de texto simplemente se haría así:
#!/bin/sh
iwconfig > archivo.txt
Hasta ahi todo bien pero si quiero guardar en una variable solamente una parte del comando??
Me explico:
Por ejemplo el comando iwconfig devuelve esto por pantalla:
iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
[b]wlan0[/b] IEEE 802.11bgn ESSID:"JAZZTEL_C8"
Mode:Managed Frequency:2.462 GHz Access Point: 00:1A:2B:4F:45:37
Bit Rate=1 Mb/s Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:4530-3031-4432-3045-3942-3943-38
Power Management:off
Link Quality=59/70 Signal level=-51 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
Si yo solo quiero guardar lo que he remarcado en negrita (wlan0) como lo hago????
Un saludo y gracias!!! ;);)
Dependerá de lo que quieras obtener.
#!/bin/bash
string=`iwconfig | grep -i "wlan" | cut -f 1 -d ' '`
ó
string=$(iwconfig | grep -i "wlan" | cut -f 1 -d ' ')
echo -e "Obtenido : ${string}";
o incluso:
perl -E '$s = qx|iwconfig|; $s =~ m/^(wlan0.*)/m; say $1;'
iwconfig | grep -i "wlan0" | awk '{print $1}'
iwconfig | awk '/wlan/'
Cita de: Leo Gutiérrez. en 30 Diciembre 2010, 08:25 AM
Dependerá de lo que quieras obtener.
#!/bin/bash
string=`iwconfig | grep -i "wlan" | cut -f 1 -d ' '`
ó
string=$(iwconfig | grep -i "wlan" | cut -f 1 -d ' ')
echo -e "Obtenido : ${string}";
o incluso:
perl -E '$s = qx|iwconfig|; $s =~ m/^(wlan0.*)/m; say $1;'
iwconfig | grep -i "wlan0" | awk '{print $1}'
Muchas gracias por tu respuesta... Ya había visto en otros post que eres el crack del scripting.
Pero ahi solo estas guardando si aparece algo como "wlan0" pero en vez de wlan0 puede aparecer mon0 o rausb0 o wlan1.... Lo que quiero es almacenar en una variable "A" lo que aparezca sea lo que sea.
Muchas gracias!!!
No estoy ni cerca de ser el "crack del scripting" ;D
Bueno, generalicemos, si queremos obtener una línea en la que haya coincidencia:
#!/bin/bash
read -p "String : " string
coincidencia=`COMANDO | grep -i "${string}"`
echo -e "Lo que obtuve : [ ${coincidencia} ]";
Si queremos obtener toda la salida del comando, ejemplo:
#!/bin/bash
coincidencia=`who`
echo -e "Salida : [ ${coincidencia} ] ";
ó
coincidencia=$(who)
Si no es lo que querías, ponme la salida del comando y lo que quieres obtener de dicho comando.
Saludos.
Pues en concreto quiero (para empezar) hacer algo tan sencillo como guardar en una variable INTERFAZ parte de lo que escupe el comando iwconfig:
Escupe esto:
root@bt:~# iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
wlan0 IEEE 802.11bgn ESSID:"JAZZTEL_C8"
Mode:Managed Frequency:2.462 GHz Access Point: 00:1A:2B:4F:45:37
Bit Rate=54 Mb/s Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:4530-3031-4432-3045-3942-3943-38
Power Management:off
Link Quality=50/70 Signal level=-60 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
Entonces lo que quiero es un script que me guarde el string "wlan0" en una variable INTERFAZ (por ejemplo). Ese wlan0 no tiene por que ser wlan0, cada vez aparece un string "aleatorio".
Un saludo y gracias de nuevo
No, disculpa pero no te entiendo. ¿Entonces cómo sabríamos qué buscar?, ¿en qué palabras nos basaríamos para recoger los datos?
Por favor, explicate mejor. O si alguien le entendió que me dé una idea.
Cita de: Leo Gutiérrez. en 30 Diciembre 2010, 22:49 PM
No, disculpa pero no te entiendo. ¿Entonces cómo sabríamos qué buscar?, ¿en qué palabras nos basaríamos para recoger los datos?
Por favor, explicate mejor. O si alguien le entendió que me dé una idea.
Pues supongo que habría que tomar los datos no enf unción de su "valor" o comprando strings sino por posición, es decir en este caso sería la primera palabra en el 5 salto de línea. no???
1 lo no wireless extensions.
2
2 eth0 no wireless extensions.
4
5 wlan0 IEEE 802.11bgn ESSID:"JAZZTEL_C8
Me entiendes???
Gracias!!!
@illera88, según tu respuesta anterior, lo que tu quieres es la coincidencia con wlan0, y ya te he dado la respuesta:
coincidencia=`comando | grep -i "wlan0"`
Lee tus mensajes y verás que lo que pides no está claro.
A ver, trataré de adivinar. lo que tu quieres es que capture TODO lo de wlan0, es decir, ¿esto?:
wlan0 IEEE 802.11bgn ESSID:"JAZZTEL_C8"
Mode:Managed Frequency:2.462 GHz Access Point: 00:1A:2B:4F:45:37
Bit Rate=1 Mb/s Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:4530-3031-4432-3045-3942-3943-38
Power Management:off
Link Quality=59/70 Signal level=-51 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
Prueba lo siguiente:
salida=`perl -E '$s = qx(iwconfig) =~ m/^(wlan0.*^$)/sm; print $s;'`
echo -e "wlan0 -> ${salida}";
Joe hay un fallo de entendimiento aqui.
AVer lo único que quiero es que capture wlan0. Es decir que si creamos una variable A sea A = wlan0.
Y no lo quiero para este caso en concreto! lo quiero para un caso genérico en el que la salida puede ser wlan0 o puede ser rausb0 o puede ser mon0.....
ES decir puede ser que la salida sea:
iwconfig
Citarlo no wireless extensions.
eth0 no wireless extensions.
wlan0 IEEE 802.11bgn ESSID:"JAZZTEL_C8"
Mode:Managed Frequency:2.462 GHz Access Point: 00:1A:2B:4F:45:37
Bit Rate=1 Mb/s Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:4530-3031-4432-3045-3942-3943-38
Power Management:off
Link Quality=59/70 Signal level=-51 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
ó
iwconfig
Citarlo no wireless extensions.
eth0 no wireless extensions.
mon0 IEEE 802.11bgn ESSID:"JAZZTEL_C8"
Mode:Managed Frequency:2.462 GHz Access Point: 00:1A:2B:4F:45:37
Bit Rate=1 Mb/s Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:4530-3031-4432-3045-3942-3943-38
Power Management:off
Link Quality=59/70 Signal level=-51 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
ó
iwconfig
Citarlo no wireless extensions.
eth0 no wireless extensions.
flkd5 IEEE 802.11bgn ESSID:"JAZZTEL_C8"
Mode:Managed Frequency:2.462 GHz Access Point: 00:1A:2B:4F:45:37
Bit Rate=1 Mb/s Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:4530-3031-4432-3045-3942-3943-38
Power Management:off
Link Quality=59/70 Signal level=-51 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
ó
....
Y yo solo quiero guardar los 4 o 5 dógitos de wlan0, mon0, flkd5... Lo que sea.
Creo que yua está más que claro...
Un saludo y gracias
A ver, prueba el siguiente script, lo que hace es que comprueba cuál dispositivo, si wlan0, mon0 ó flkd5 está activo. Guarda en una variable el nombre del dispositivo activo:
#!/bin/bash
devices=(
wlan0
mon0
flkd5
);
for device in "${devices[@]}"
do
iwconfig | grep -i "^${device}" > /dev/null && {
dispositivo=$device
}
done
echo -e "Dispositivo detectado : $dispositivo";
En una sola línea:
#!/bin/bash
dispositivo=$(iwconfig | grep "^wlan0\|mon0\|flkd5" | cut -f 1 -d' ');
echo -e "Dispositivo encontrado : ${dispositivo}";
#!/bin/bash
dispositivo=$(iwconfig | awk '/^(wlan0|mon0|flkd5)/ {print $1}')
echo -e "Dispositivo encontrado : $dispositivo";
Claro pero estamos en las mismas...
NO sabemos el nombre de la variable a guardar. puede ser wlan0 mon0 o lo que sea! hay que hacerlo pero en genérico apra que capture sea lo que sea no solmante en esos tres casos...
Eso no se puede hacer???
Y pensar que algo a priori tan sencillo como guardar en una variable parte de lo que escupe un comando sea luego tan dificil...
Quizás sería mejor hacerlo en otro lenguaje??? Recomendaciones???
Quiro poder luego hacerlo con interfaz gráfica...
Un saludo
No, no es para nada dificil, solo que no nos entendimos bien, creo que en este caso sería mejor suponer que lo que quieres está en determinada línea.
Dame unos minutos.
Listo...
#!/usr/bin/bash
dispositivo=`iwconfig | sed -n '5,5p' | awk '{print $1}'`
echo -e "Dispositivo : $dispositivo";
Ahí suponemos que el dispositivo que buscas está en la línea 5 y lo obtenemos.