Bash es una de las herramientas más potentes que tenemos a nuestro alcance, aunque no sólo de bash trata el artículo, sino de trucos para consola, one-liner como dirían muchos (aunque habrá algunos two-liners) que podemos utilizar y pueden hacernos la vida un poco más fácil:
Cadenas de texto
Trim
Es una herramienta que utilizaremos para recortar nuestra cadena basándonos en los a la ìzquierda y a la derecha, en este caso nos basaremos en los espacios, que es uno de sus usos más comunes (así podemos obtener la cadena limpia tanto por delante como por detrás. Podemos ver un ejemplo en C aquí; aunque en la terminal muchas veces es útil, y sobre todo para nuestros scripts.
1 2 | CADENA=" Esto es una cadena "; echo ["${CADENA#"${CADENA%%[![:space:]]*}"}"] |
Donde sólo recortamos a la izquierda:
[Esto es una cadena ]
1 2 | CADENA=" Esto es una cadena "; echo ["${CADENA%"${CADENA##*[![:space:]]}"}"] |
Donde sólo recortamos a la derecha:
Esto es una cadena
Si queremos recortar a los dos lados, podemos ejecutar los dos, podemos juntar las dos instrucciones anteriores:
1 2 3 4 | CADENA=" Esto es una cadena "; CADENA="${CADENA#"${CADENA%%[![:space:]]*}"}" CADENA="${CADENA%"${CADENA##*[![:space:]]}"}" echo $CADENA |
O si queremos acudir a sed:
1 2 3 4 | CADENA=" Esto es una cadena "; echo $CADENA | sed 's/\s*\(.*\)\s*/\1/g' # Forma antigua en el post #echo $CADENA | sed 's/^\s\(.*\)\s\$/\1/g' |
La nueva expresión con sed me ha dado mejores resultados en algunas cadenas resultantes de la ejecución de algunos comandos. Dejo la antigua para referencia.
Calendarios
Si queremos un calendario de 2030:
$ cal 2030
Si queremos un calendario de Febrero de 2050
$cal 2 2050
Contar palabras
Contar las palabras que salen en un texto diciendo cuántas veces sale cada una (el texto es FICHERO.txt):
tr -c a-zA-Z ‘\n’ < FICHERO.txt | sed ‘/^$/d’ | sort | uniq -i -c | sort -n
El primer comando (tr) pone una palabra en cada línea, sed, elimina las líneas vacías, el primer sort ordena las palabras, poniendo las palabras repetidas todas juntas, uniq pone sólo una vez cada palabra, y dice cuántas veces se repiten (porque están juntas), el último sort ordena las palabras por número de apariciones.
Si queremos que se contabilicen tildes, eñes y otros símbolos, probad
$ tr -c a-zA-Zá-úñ ‘\n’ < contar | sed ‘/^$/d’ | sort | uniq -i -c | sort -n
, podemos pasadle a tr los caracteres que necesitemos. Gracias nauta.
Extraer información de las columnas de la entrada
Muy útil si tenemos una información en columnas y queremos cambiar el orden de las mismas:
1 2 | col() { awk '{print $('$(echo $* | sed -e s/-/NF-/g -e 's/ /),$(/g')')}'; } echo "AAA BBB CCC" | col 1 3 -1 -2 |
Esto devolverá
AAA CCC BBB AAA
Introducir en nuestro editor lo que estamos escribiendo
Escribimos una línea en la consola, ahora pulsamos Control X, Control E y automáticamente aparecerá esa línea en nuestro editor por defecto. Para configurar nuestro editor (por ejemplo a nano):
$ export EDITOR=nano
Poner una cadena en mayúsculas o minúsculas
Podemos hacerlo fácilmente con tr:
$ echo ‘hola Mundo’ | tr ‘[:lower:]’ ‘[:upper:]’
y para pasar a minúsculas:
$ echo ‘hola Mundo’ | tr ‘[:upper:]’ ‘[:lower:]’
podemos usar awk:
$ echo “hola mundo” | awk ‘{print toupper($0)}’
o para minúsculas
$ echo “HOLA MUNDO” | awk ‘{print tolower($0)}’
podemos usar perl:
$ echo “hola mundo” | perl -e ‘print uc ;’
o para minúsculas
$ echo “HOLA MUNDO” | perl -e ‘print lc ;’
o desde el mismo bash de la siguiente forma:
1 2 3 4 5 6 7 | ;A mayúsculas... TEXTO="Hola Mundo" echo "${TEXTO^^}" ;Ay minúsculas... TEXTO="hOLA mUNDO" echo "${TEXTO,,}" |
Información y mantenimiento del sistema
Sobre los slots de RAM en nuestro equipo
Para ver esta información necesitamos privilegios de root
# dmidecode -t memory
Si tenemos disponible sudo, podemos hacer
$ sudo dmidecode -t memory
Espacio libre y ocupado en disco
Con esto vemos el espacio libre en un formato que podemos entender (megabytes, gigabytes…)
$ df -h
Conocer el UUID de los discos
Si queremos conocer el identificador único de nuestros discos duros, pendrives o demás dispositivos de almacenamiento, podemos hacer (como root, o con sudo delante):
$ sudo blkid
Si queremos conocer el UUID de un dispositivo en particular, por ejemplo sdc2 podemos hacer:
$ sudo blkid /dev/sdc2
Los 10 procesos que más CPU utilizan
$ ps -eo user,%cpu,%mem,rsz,args,pid,lstart|sort -rnk2|awk ‘BEGIN {printf “%12s\t%s\t%s\t%s\t%s\n”,”USER”,”%CPU”,”%MEM”,”RSZ”,”COMMAND”,”PID”,”Started”}{printf “%12s\t%g’%’\t%g’%’\t%d MB\t%s\n”,$1,$2,$3,$4/1024,$5}’|head -n10
Borrar cachés
Hay que ejecutar como root lo siguiente, veremos algo de RAM libre
# echo 3 > /proc/sys/vm/drop_caches
Si no somos root o nos da pereza, ya que no podemos poner sudo delante:
$ echo 3 | sudo tee /proc/sys/vm/drop_caches
Conocer todos los usuarios del sistema
cat /etc/passwd | sort | cut -d”:” -f1
Conocer la cantidad de Swap utilizada
$ free | grep Swap | awk ‘{printf “Swap Used: %.2f%\n”,$3*100/$2}’
Ejecución de órdenes
Tiempo y recursos utilizados al ejecutar un programa
Para ver el tiempo utilizado en la ejecución de un comando, podemos utilizar:
$ time [COMANDO]
por ejemplo:
$ time lsof
Para saber los archivos abiertos en este momento, y ver el tiempo empleado en obtener esa información.
Si queremos más información podemos hacer:
/usr/bin/time -f ‘rss=%Mk etime=%E user=%U sys=%S in=%I out=%O’ lsof
Con lo que nos dirá la memoria empleada el tiempo de usuario, sistema y el número de entradas y salidas en el sistema de archivos.
Obtener el último comando utilizado
Lo podemos hacer poniendo !!:
$ !!
Eso puede tener muchas utilidades, por ejemplo, cuando queremos ejecutar el último comando ejecutado con sudo delante:
$ sudo !!
O si queremos escribir el último comando (una línea muy larga, por ejemplo) en un fichero:
$ echo “!!” > fichero
O introducir el resultado de la última ejecución en una variable:
$ VARIABLE=`!!`
Cambiar una parte de la ejecución anterior
Imaginemos que hemos escrito una línea muy larga y nos hemos equivocado en una pequeña parte, actualmente usamos casi siempre entorno gráfico y copiamos, pegamos y listo, pero hay otra forma más geek:
$ echo “Eres un admin muy feo”
$ ^feo^guapo
echo “Eres un admin muy guapo”
Eres un admin muy guapo
Seguro que veis la idea.
Insertar el último argumento anterior
Es como antes, ahora con el copia y pega se pierden las buenas técnicas. Para eso tenemos que pulsar (ALT+.) Alt y la tecla punto:
$ ls Descargas/Programas/Temas/Thunderbird
$ cd [ALT+.]
Ejecutar un comando a una hora determinada
Para ello podemos hacer:
echo “mplayer Musica/Cancion.mp3″ | at 19:20
Para reproducir música a las 19:20 o
echo “mplayer Musica/Cancion.mp3″ | at now + 30min
para ejecutarlo dentro de media hora.
echo “mplayer Musica/Cancion.mp3″ | at tomorrow
para ejecutarlo mañana.
Navegación por directorios
Volver al directorio de usuario
Podemos hacerlo de dos formas:
cd
o
cd ~
Ir al home de un usuario concreto
cd ~usuario
Ir al directorio anterior
Con este comando si cambiamos de directorio por un momento, luego podemos volver donde estábamos
cd –
Ir a un directorio y almacenarlo en un historial
Con este comando nos dirigiremos a otro directorio, pero almacenaremos un historial de directorios visitados (y luego podremos volver)
$ pushd ~/Descargas
~/Descargas
Volver al último directorio que tenemos en el historial
$ popd
Ejecutar un script local en un servidor remoto
$ ssh usuario@servidor bash
Ejecutar un comando en segundo plano, y poder ver el estado en cualquier momento
$ screen -d -m -S MiPing ping google.com
Cuando queramos ver el estado, hacemos
$ screen -R MiPing
Dentro de esa ventana, podemos pulsar Control C para cerrar el programa o Control A Control Z para seguir en segundo plano.
Archivos
Montar un disco RAM
Necesitamos un disco RAM para algo rápido… unos 100Mb (como root):
# mkdir /mnt/tmp
# mount -t tmpfs tmpfs /mnt/tmp -o size=100m
Pero todo lo que guardemos se perderá cuando reiniciemos el ordenador o cuando hagamos:
# umount /mnt/tmp
Crear un archivo con información aleatoria
Con esto, creamos un fichero de 1Mb (1K*1024)
dd if=/dev/urandom of=test count=1024 bs=1K
Listar archivos (ls)
Ver los archivos del directorio actual (incluyendo ocultos, en modo lista, ordenador por fecha de forma ascendente y los tamaños en formato humano
$ ls -latrh
Ver los archivos del directorio actual (incluyendo ocultos, en modo lista, ordenador por tamaño de forma descendente y los tamaños en formato humano
$ ls -laSh
Buscar archivos (find)
Buscar todos los archivos que contengan playa y terminen en jpg (sin distinguir mayúsculas de minúsculas que tengan menos de 2 semanas (14 días)
find . -mtime -14 -iname ‘*playa*jpg’
Borrar archivos log con más de 30 días:
find . -name ‘*.log’ -mtime +30 -type f -exec rm {} \;
Montar un fichero .iso (como root)
# mkdir /mnt/cdvirtual
# mount -t iso9660 -o loop file.iso /mnt/cdvirtual
Si el ISO está en formato UDF (si contiene ficheros de más de 2Gb), poner udf en lugar de iso9660
Conocer los archivos más pesados
Para ver el TOP 3 de los archivos más pesados en el directorio actual y subdirectorios:
$ find -printf “%s\t%P\n” | sort -r -n | head -n 3
Cambiar el orden de una secuencia de archivos
Tenemos archivos secuencia0001.png a secuencia0124.png y queremos invertir el orden de la secuencia, ahora serán secuenciaB…
$ for i in {1..124}; do cp $(printf “secuencia%04d.png” $i) $(printf “secuenciaB%04d.png” $((125-$i))) ; done
Es importante ver que al principio está el 124 como último número, y al final la operación es 125-$i (esto es porque empezamos en 0001). Es recomendable no llamar igual a la secuencia, o si no, en lugar de cp, podemos usar mv.
Cambiar la extensión de un archivo
$ mv archivo.{actual,nueva}
Copiar determinados capítulos de una serie
Por ejemplo, de la primera temporada, del 5 al 14, los copiamos al directorio /mnt/compartido
$ cp Serie1x{05..14}* /mnt/compartido
Detectar archivos duplicados
Si ejecutamos esto en el directorio actual se buscarán ficheros en todos los subdirectorios.
$ find -not -empty -type f -printf “%s\n” | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 –all-repeated=separate
Buscar un texto en todos los arhivos de una carpeta y subcarpetas
$ egrep -R ‘CADENA’ *
Descomprimir todos los tar.bz2 del directorio actual
$ for ARCHIVO in *; do tar -xvjf $ARCHIVO; done
Grabar un DVD con los contenidos de un directorio
Cuidado con sobrepasar el tamaño del DVD
$ growisofs -dvd-compat -Z /dev/scd0 -R -J -pad /directorio/a/grabar
Red
Puerto y PID que lo usa
Para los puertos TCP:
$ netstat -tnp
Para los puertos UDP:
$ netstat -unp
Para ver los puertos que hay escuchando, pondremos también un -l.
Conocer nuestra IP externa
$ curl ifconfig.me
o
$ curl http://checkip.dyndns.org/
Un servidor web sencillo en el directorio actual
Este comando iniciará un servidor web en el puerto 8000
$ python -m SimpleHTTPServer
Si queremos especificar el puerto:
$ python -m SimpleHTTPServer 9000
Avisarme cuando un servidor vuelva a estar activo
Sólo vale si google.com se cae, pero si se cae uno de nuestros servidores podemos poner un aviso para que nos avise cuando vuelva a verse el servidor. También vale si nosotros nos caemos y queremos ver cuánto ha durado un corte de conexión de nuestro operador.
while ! ping -c1 google.com; do sleep 1; done && echo “El servidor ha vuelto: “`date` | zenity –text-info
Conocer la IP de nuestro dispositivo de red
Si no nos vale con poner ifconfig y tener toda la información, podemos hacer:
$ LANG=C; ifconfig wlan0 | perl -n -e ‘if (m/inet addr:([\d\.]+)/g) { print $1 }’
Cálculo
Hacer una cuenta
Podemos pasar a bc las operaciones que queremos realizar:
$ echo “1+4+6*9+9*10+34-25/2″ | bc
Si la operación devuelve decimales (un máximo de 3):
$ echo “scale=3; 7863/2398″ | bc
Si queremos hacer cálculos con senos y cosenos. Seno de pi/2:
$ echo “scale=2; s(3.141592/2)” | bc -l
Calcular pi con 100 decimales:
$ echo “scale=100; 4*a(1)
Operaciones sencillas
Sólo operaciones sencillas (sumas, restas, multiplicaciones y divisiones) enteras. Es más rápido que bc
$ let VARIABLE=1+2+3+4*5
También lo podemos hacer con versiones nuevas de BASH así:
$ echo $((4+5+3*4-4/2))
O utilizando expr (aunque tenemos que poner un espacio entre cada elemento)
$ expr 2 + 3 + 4 * 5 / 2
Cambios de base
De decimal a octal (120 es el decimal)
$ printf “%o” 120
De decimal a hexadecimal
$ printf “%X” 120
o (si queremos la letra en minúscula)
$ printf “%x” 120
De base A (hasta 16) a base B (hasta la que queramos)
$ echo “ibase=A; obase=B; N” | bc
por ejemplo, para pasar de hexadecimal a binario:
$ echo “ibase=16; obase=2; FF” | bc
o para pasar de binario a decimal:
$ echo “ibase=2; 11011101″ | bc
Generar una secuencia de números
Generar una secuencia del 1 al 100:
$ seq 1 100
Generar una secuencia del -50 al 50
$ echo {-50..50}
Otros
Separar en varios archivos un archivo VCF con muchos contactos
1 2 3 4 5 | Esto es útil si quieres pasar tus contactos de Android a Symbian (para un móvil antiguo , por ejemplo) for i in `grep -n '^BEGIN:VCARD' "Archivo.VCF" | cut -d ':' -f 1`; do j=`tail -n "+$i" "$VCFILE" | grep -ne '^END:VCARD' -m 1 | cut -d ':' -f 1` tail -n "+$i" "$VCFILE" | head -n "$j" > "$i.vcf" done |
Separar en varios archivos un archivo VCS con muchos calendarios
1 2 3 4 | for i in `grep -n '^BEGIN:VTODO' "Archivo.VCS" | cut -d ':' -f 1`; do j=`tail -n "+$i" "$VCFILE" | grep -ne '^END:VTODO' -m 1 | cut -d ':' -f 1` ( echo 'BEGIN:VCALENDAR' ; echo 'VERSION:1.0' ; tail -n "+$i" "$VCFILE" | head -n "$j" ; echo 'END:VCALENDAR' ) > "$i.vcs" done |
Listar todas las tablas de una base de datos MySQL
$ mysql -pPASSWORD -uUSUARIO -e ‘use BASE; show tables;’ | while read i; do echo $i; done
Referencias
Muchos son míos, otros han sido vistos en varios sitios hace tiempo, y otros son clásicos, que están en muchos sitios. Pero aquí mencionaré algunas fuentes (en algunas podréis encontrar más ejemplos y otros one-liners que no he incluído en la lista):
Bash One-Liners
Just another tech blog
Good coders code, great reuse
Al pan pan y al vino vino
All about Symbian Forums
Fusion242
Actualizaciones
Actualizado el 22/04/2013, añadida una solución para contar palabras con símbolos y eñes.
Actualizado el 04/02/2015, modificado el trim con sed. Ahora funciona mejor (el antiguo daba problemas con algunas cadenas de caracteres)
Actualizado el 25/10/2015, corregidos unos caracteres que no salían bien y descolocaban parte del texto en Contar palabras.
The post Magia en Bash 50 ejemplos en una sola linea (o dos) appeared first on Poesía Binaria.