Quantcast
Channel: procesos – Poesía Binaria
Viewing all articles
Browse latest Browse all 35

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

$
0
0

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.


Viewing all articles
Browse latest Browse all 35

Trending Articles