Está en la página 1de 13

Magia en Bash 50 ejemplos en una sola linea (o dos)

Bash es una de las herramientas ms potentes que tenemos a nuestro alcance, aunque no slo de bash
trata el artculo, sino de trucos para consola, one-liner como diran muchos (aunque habr algunos twoliners) que podemos utilizar y pueden hacernos la vida un poco ms fcil:

Cadenas de texto
Trim
Es una herramienta que utilizaremos para recortar nuestra cadena basndonos en los a la zquierda y a
la derecha, en este caso nos basaremos en los espacios, que es uno de sus usos ms comunes (as
podemos obtener la cadena limpia tanto por delante como por detrs. Podemos ver un ejemplo en C
aqu; aunque en la terminal muchas veces es til, y sobre todo para nuestros scripts.
1CADENA=" Esto es una cadena ";
2echo ["${CADENA#"${CADENA%%[![:space:]]*}"}"]

Donde slo recortamos a la izquierda:


[Esto es una cadena ]
1CADENA=" Esto es una cadena ";
2echo ["${CADENA%"${CADENA##*[![:space:]]}"}"]

Donde slo 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:
1CADENA=" Esto es una cadena ";
2CADENA="${CADENA#"${CADENA%%[![:space:]]*}"}"
3CADENA="${CADENA%"${CADENA##*[![:space:]]}"}"
4echo $CADENA

O si queremos acudir a sed:


CADENA=" Esto es una cadena ";
1
echo $CADENA | sed 's/\s*\(.*\)\s*/\1/g'
2
# Forma antigua en el post
3
#echo $CADENA | sed 's/^\s\(.*\)\s\
4
$/\1/g'

La nueva expresin con sed me ha dado mejores resultados en algunas cadenas resultantes de la
ejecucin 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 cuntas 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 lnea, sed, elimina las lneas vacas, el primer sort
ordena las palabras, poniendo las palabras repetidas todas juntas, uniq pone slo una vez cada palabra,
y dice cuntas veces se repiten (porque estn juntas), el ltimo sort ordena las palabras por nmero de
apariciones.
Si queremos que se contabilicen tildes, ees y otros smbolos, 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 informacin de las columnas de la entrada


Muy til si tenemos una informacin en columnas y queremos cambiar el orden de las mismas:
col() { awk '{print $('$(echo $* | sed -e s/-/NF-/g -e 's/ /),$
1
(/g')')}'; }
2
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 lnea en la consola, ahora pulsamos Control X, Control E y automticamente aparecer
esa lnea en nuestro editor por defecto. Para configurar nuestro editor (por ejemplo a nano):
$ export EDITOR=nano

Poner una cadena en maysculas o minsculas


Podemos hacerlo fcilmente con tr:
$ echo hola Mundo | tr [:lower:] [:upper:]
y para pasar a minsculas:

$ echo hola Mundo | tr [:upper:] [:lower:]


podemos usar awk:
$ echo hola mundo | awk {print toupper($0)}
o para minsculas
$ echo HOLA MUNDO | awk {print tolower($0)}
podemos usar perl:
$ echo hola mundo | perl -e print uc ;
o para minsculas
$ echo HOLA MUNDO | perl -e print lc ;
o desde el mismo bash de la siguiente forma:
1;A maysculas...
2TEXTO="Hola Mundo"
3echo "${TEXTO^^}"
4
5;Ay minsculas...
6TEXTO="hOLA mUNDO"
7echo "${TEXTO,,}"

Informacin y mantenimiento del sistema


Sobre los slots de RAM en nuestro equipo
Para ver esta informacin 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 dems 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 ms 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 cachs
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}

Ejecucin de rdenes
Tiempo y recursos utilizados al ejecutar un programa
Para ver el tiempo utilizado en la ejecucin 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
informacin.
Si queremos ms informacin 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 nmero 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 lnea muy larga, por ejemplo) en un fichero:
$ echo !! > fichero
O introducir el resultado de la ltima ejecucin en una variable:
$ VARIABLE=`!!`

Cambiar una parte de la ejecucin anterior


Imaginemos que hemos escrito una lnea muy larga y nos hemos equivocado en una pequea parte,
actualmente usamos casi siempre entorno grfico y copiamos, pegamos y listo, pero hay otra forma
ms 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 tcnicas. 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 msica 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 maana.

Navegacin 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
estbamos
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 rpido 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 informacin 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 tamaos en formato humano
$ ls -latrh
Ver los archivos del directorio actual (incluyendo ocultos, en modo lista, ordenador
por tamao de forma descendente y los tamaos en formato humano
$ ls -laSh

Buscar archivos (find)


Buscar todos los archivos que contengan playa y terminen en jpg (sin distinguir
maysculas de minsculas que tengan menos de 2 semanas (14 das)
find . -mtime -14 -iname *playa*jpg

Borrar archivos log con ms de 30 das:


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 ms de 2Gb), poner udf en
lugar de iso9660

Conocer los archivos ms pesados


Para ver el TOP 3 de los archivos ms 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 sern 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 nmero, y al final la
operacin 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 extensin de un archivo


$ mv archivo.{actual,nueva}

Copiar determinados captulos 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 buscarn 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 tamao 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 tambin 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
Slo 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. Tambin vale
si nosotros nos caemos y queremos ver cunto ha durado un corte de conexin 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 informacin, podemos hacer:
$ LANG=C; ifconfig wlan0 | perl -n -e if (m/inet addr:([\d\.]+)/g) { print
$1 }

Clculo
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 operacin devuelve decimales (un mximo de 3):
$ echo scale=3; 7863/2398 | bc
Si queremos hacer clculos 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
Slo operaciones sencillas (sumas, restas, multiplicaciones y divisiones) enteras. Es
ms rpido que bc
$ let VARIABLE=1+2+3+4*5
Tambin 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 minscula)
$ 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 nmeros


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

Separar en varios archivos un archivo VCS con


muchos calendarios

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 mos, otros han sido vistos en varios sitios hace tiempo, y otros son
clsicos, que estn en muchos sitios. Pero aqu mencionar algunas fuentes (en
algunas podris encontrar ms ejemplos y otros one-liners que no he includo 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, aadida una solucin para contar palabras con smbolos
y ees.
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 salan bien y
descolocaban parte del texto en Contar palabras.

http://totaki.com/poesiabinaria/2013/01/magia-en-bash-49-ejemplos-en-una-sola-linea-o-dos/