[BASH]Simplemente guardar string en una variable

Iniciado por illera88, 30 Diciembre 2010, 00:02 AM

0 Miembros y 1 Visitante están viendo este tema.

illera88

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!!! ;);)

leogtz

#1
Dependerá de lo que quieras obtener.
Código (bash) [Seleccionar]
#!/bin/bash
string=`iwconfig | grep -i "wlan" | cut -f 1 -d ' '`

ó
Código (bash) [Seleccionar]
string=$(iwconfig | grep -i "wlan" | cut -f 1 -d ' ')
echo -e "Obtenido : ${string}";


o incluso:

Código (bash) [Seleccionar]
perl -E '$s = qx|iwconfig|; $s =~ m/^(wlan0.*)/m; say $1;'

Código (bash) [Seleccionar]
iwconfig | grep -i "wlan0" | awk '{print $1}'

Código (bash) [Seleccionar]
iwconfig | awk '/wlan/'
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

illera88

Cita de: Leo Gutiérrez. en 30 Diciembre 2010, 08:25 AM
Dependerá de lo que quieras obtener.
Código (bash) [Seleccionar]
#!/bin/bash
string=`iwconfig | grep -i "wlan" | cut -f 1 -d ' '`

ó
Código (bash) [Seleccionar]
string=$(iwconfig | grep -i "wlan" | cut -f 1 -d ' ')
echo -e "Obtenido : ${string}";


o incluso:

Código (bash) [Seleccionar]
perl -E '$s = qx|iwconfig|; $s =~ m/^(wlan0.*)/m; say $1;'

Código (bash) [Seleccionar]
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!!!

leogtz

No estoy ni cerca de ser el "crack del scripting"  ;D

Bueno, generalicemos, si queremos obtener una línea en la que haya coincidencia:

Código (bash) [Seleccionar]
#!/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:

Código (bash) [Seleccionar]
#!/bin/bash
coincidencia=`who`
echo -e "Salida : [ ${coincidencia} ] ";


ó
Código (bash) [Seleccionar]
coincidencia=$(who)

Si no es lo que querías, ponme la salida del comando y lo que quieres obtener de dicho comando.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

illera88

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

leogtz

#5
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.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

illera88

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!!!

leogtz

#7
@illera88, según tu respuesta anterior, lo que tu quieres es la coincidencia con wlan0, y ya te he dado la respuesta:

Código (bash) [Seleccionar]
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:
Código (bash) [Seleccionar]
salida=`perl -E '$s = qx(iwconfig) =~ m/^(wlan0.*^$)/sm; print $s;'`
echo -e "wlan0 -> ${salida}";


Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

illera88

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


leogtz

#9
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:

Código (bash) [Seleccionar]
#!/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:

Código (bash) [Seleccionar]
#!/bin/bash
dispositivo=$(iwconfig | grep "^wlan0\|mon0\|flkd5" | cut -f 1 -d' ');
echo -e "Dispositivo encontrado : ${dispositivo}";



Código (bash) [Seleccionar]
#!/bin/bash
dispositivo=$(iwconfig | awk '/^(wlan0|mon0|flkd5)/ {print $1}')
echo -e "Dispositivo encontrado : $dispositivo";
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com