shellscript

Nov 11 13:48

Obtener la interfaz de red wireless

Para aquellas veces que se necesita conocer la interfaz wifi de un equipo en un script o algo.
awk -F: '/:/ {gsub(" ","",$1); print $1}' /proc/net/wireless
Lenguaje: 
bash
Nov 11 11:05

Listado hardware y sus identificadores

Alguna vez he necesitado saber el identificador de una tarjeta gráfica, de red o similar, para ver si está soportada por el kernel que se está usando o para añadir su identificador a su driver y que así lo reconozca el kernel. De esta forma se puede obtener un listado con los nombres de los dispositivos y sus correspondientes identificadores ("vendor id" y "device id"):
$ (lspci;lspci -n) | sort > lspci.lst
 
# esto obtiene una lista como la siguiente:
00:02.0 0300: 8086:27a2 (rev 03)
00:02.0 VGA compatible controller: Intel Corporation Mobile 945GM/GMS,
943/940GML Express Integrated Graphics Controller (rev 03)
01:00.0 0200: 11ab:4362 (rev 22)
01:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8053 PCI-E Gigabit
Ethernet Controller (rev 22)
02:00.0 0200: 168c:001c (rev 01)
02:00.0 Ethernet controller: Atheros Communications Inc.
Nov 07 09:13

Imprimir una columna de una linea filtrandola por su contenido con awk

Como me he decidido a guardar toda sentencia sed/awk que vaya usando y me lleve más de 5mins resolverla para tenerlo a mano a posteriori, aquí pongo otro snippet que imprimirá; una columna de una linea filtrandola por su contenido con una condición.
# esto imprimirá solo las columnas que contengan "root"
 
$ awk '{for (i=1;i<=NF;i++)  if ( $i ~ "root" ) print $i}' /proc/cmdline
 
# Se le podrían poner condiciones más complejas, por ejemplo, usando regex.
Lenguaje: 
bash
Nov 06 13:27

Sustituir un bloque de un archivo por un texto

Sustituir palabras o frases con sed en un archivo, es fácil, lo que no es trivial es que encuentre un bloque determinado de texto y ese bloque lo sustituya por otra cosa. Pero no que te sustituya por línea sino TODO el bloque. Aquí un ejemplo de cómo sustituir las entradas de los kernels que hay en un menu.lst del grub
#!/bin/sh
 
sed -i.bak -n -e '1,/### BEGIN AUTOMAGIC KERNELS LIST/ p' \
       -e '/### BEGIN AUTOMAGIC KERNELS LIST/ a\
Una lí­nea \
otra línea \
\
¿Una entrada del kernel?' \
       -e '/### END DEBIAN AUTOMAGIC KERNELS LIST/,$ p' menu.lst
Nov 04 11:30

Borrar la linea número N de un fichero con 'sed'

Aquellos que uséis ssh a diario con máquinas virtuales y demás, conoceréis el incordio que es arreglar esto: "Offending key in /home/usuario/.ssh/known_hosts:60" Normalmente yo abría con un "vi /home/usuario/.ssh/known_hosts +60" pulsaba dos veces la tecla 'd' y ':x', pero esto se hacía pesado, así que empecé a hacerlo con 'sed'. Y aquí tenéis dos ejemplos sencillos, uno para imprimir la linea N y otro para borrarla respectivamente:
sed -n '60p' /home/usuario/.ssh/known_hosts
sed -i '60d' /home/usuario/.ssh/known_hosts
Oct 27 18:20

Menú básico en bash

Ejemplo de un menú básico en bash. Este menú permite pasar varias opciones a la vez. Si queremos que sea alguna opción sea excluyente había que poner un «break» en vez de un «shift» al terminar las tareas de esa opción.
#!/bin/bash
 
 
while [ "$#" -gt 0 ]
do
	case $1 in
	-h | --help)
		echo "Ayuda del programa $(basename $0)"
                echo "   blablaba"
		shift
		;;
	-l | --list)
		echo "Lista de optiones:"
                echo " -h | --help  Descripción"
                echo " -l | --list  Descripción"
                echo " -a | --append [parámetro]  Descripción"
		shift
		;;
 
	-a | --append)
		echo "Opción con parámetro:"
                shift
                parameter="$1"
		shift
		;;
	*)  
		echo "Otras opciones"
		shift
		;;
	esac
done
Oct 09 05:47

Arrays en BASH

Ejemplos de como crear y usar arrays en BASH
### Arrays en bash ###
 
## Declarar un array
# 1 - Con typeset o declare
typeset ARRAY[10] # Definido un array de nombre ARRAY de 10 elementos
typeset -a VECTOR # Definido un array de nombre VECTOR sin tamaño definid
decalre ARRAY[10] # Definido un array de nombre ARRAY de 10 elementos
declare -a VECTOR # Definido un array de nombre VECTOR sin tamaño definid
 
# 2 - Declarando y asignando
LIST[0]="Tomate"  # Se crea un array LIST cuyo primer elemento es "tomate"
NAMES=(Pepe Ana Juan Antonio María)  # Se crea una lista yle asigna los nombre.
 
## Asignar valores
# NOMBRE_ARRAY[indic
Oct 09 03:47

Obtener los módulos de los dispositivos PCI de una máquina

Un script sencillo que te muestra los módulos que existen en el kernel que tengas arrancado que necesitan los dispositivos PCI (conectados al bus PCI) de tu ordenador.
# search modules for pci devices
get_pci_modules () {
    while read IGNORE ID IGNORE
    do
        VENDOR=`echo $ID | cut -b1-4`
        DEVICE=`echo $ID | cut -b5-8`
        DEVENTRY=`echo 0x0000${VENDOR} 0x0000${DEVICE}`
        cat /lib/modules/`uname -r`/*.pcimap | grep "$DEVENTRY" | cut -d ' ' -f1
    done
}
 
for MODULE in `get_pci_modules < /proc/bus/pci/devices | sort -u` ; do
    echo $MODULE 
done
Oct 09 03:40

Obtener la IP de una interfaz de red (eth0), pero sólo la IP

Un ejemplo de uso de AWK, en el que se busca la IP de una interfaz de red.
ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}'
Oct 09 03:32

Borrar una línea específica con sed

Algunos ejemplos de borrar líneas concretas con sed
# borrar la línea 18 del archivo '~/.ssh/known_hosts'
sed -i '18 d' ~/.ssh/known_hosts
 
# o también 
sed -i 18d ~/.ssh/known_hosts
 
# borrar algunas líneas:
# borrar 6 líneas a partir de la línea 8
sed -i 8,+6d file.txt 
 
 
# borrar la línea donde se encuentre el texto 'TO DELETE'
sed -i '/TO DELETE/ d' file.txt