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:
Si queremos un calendario de Febrero de 2050
Contar palabras
Contar las palabras que salen en un texto diciendo cuántas veces sale cada una (el texto es FICHERO.txt):
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
Podemos pasarle a tr los caracteres que necesitemos. Podemos ver que las vocales con tilde y ñ salen en este nuevo listado. 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):
Poner una cadena en mayúsculas o minúsculas
Podemos hacerlo fácilmente con tr:
y para pasar a minúsculas:
podemos usar awk:
o para minúsculas
podemos usar perl:
o para minúsculas
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
Si tenemos disponible sudo, podemos hacer
Espacio libre y ocupado en disco
Con esto vemos el espacio libre en un formato que podemos entender (megabytes, gigabytes…)
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):
Si queremos conocer el UUID de un dispositivo en particular, por ejemplo sdc2 podemos hacer:
Los 10 procesos que más CPU utilizan
Borrar cachés
Hay que ejecutar como root lo siguiente, veremos algo de RAM libre
Si no somos root o nos da pereza, ya que no podemos poner sudo delante:
Conocer todos los usuarios del sistema
Conocer la cantidad de Swap utilizada
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:
por ejemplo:
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:
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. ¡Ojo! Bash tiene una implementación de time diferente a /usr/bin/time , por eso hay que poner la ruta completa.
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:
O si queremos escribir el último comando (una línea muy larga, por ejemplo) en un fichero:
O introducir el resultado de la última ejecución en una 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:
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:
Ejecutar un comando a una hora determinada
Para ello podemos hacer:
Para reproducir música a las 19:20 o
para ejecutarlo dentro de media hora.
para ejecutarlo mañana.
Navegación por directorios
Volver al directorio de usuario
Podemos hacerlo de dos formas:
o
Ir al home de un usuario concreto
Ir al directorio anterior
Con este comando si cambiamos de directorio por un momento, luego podemos volver donde estábamos
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)
Volver al último directorio que tenemos en el historial
Ejecutar un script local en un servidor remoto
Ejecutar un comando en segundo plano, y poder ver el estado en cualquier momento
Cuando queramos ver el estado, hacemos
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):
Pero todo lo que guardemos se perderá cuando reiniciemos el ordenador o cuando hagamos:
Crear un archivo con información aleatoria
Con esto, creamos un fichero de 1Mb (1K*1024)
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
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
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)
Borrar archivos log con más de 30 días:
Montar un fichero .iso (como root)
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:
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…
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
Copiar determinados capítulos de una serie
Por ejemplo, de la primera temporada, del 5 al 14, los copiamos al directorio /mnt/compartido
Detectar archivos duplicados
Si ejecutamos esto en el directorio actual se buscarán ficheros en todos los subdirectorios.
Buscar un texto en todos los arhivos de una carpeta y subcarpetas
Descomprimir todos los tar.bz2 del directorio actual
Grabar un DVD con los contenidos de un directorio
Cuidado con sobrepasar el tamaño del DVD
Red
Puerto y PID que lo usa
Para los puertos TCP:
Para los puertos UDP:
Para ver los puertos que hay escuchando, pondremos también un -l.
Conocer nuestra IP externa
o
Un servidor web sencillo en el directorio actual
Este comando iniciará un servidor web en el puerto 8000
Si queremos especificar el puerto:
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.
Conocer la IP de nuestro dispositivo de red
Si no nos vale con poner ifconfig y tener toda la información, podemos hacer:
Cálculo
Hacer una cuenta
Podemos pasar a bc las operaciones que queremos realizar:
Si la operación devuelve decimales (un máximo de 3):
Si queremos hacer cálculos con senos y cosenos. Seno de pi/2:
Calcular pi con 100 decimales:
Operaciones sencillas
Sólo operaciones sencillas (sumas, restas, multiplicaciones y divisiones) enteras. Es más rápido que bc
También lo podemos hacer con versiones nuevas de BASH así:
O utilizando expr (aunque tenemos que poner un espacio entre cada elemento)
Cambios de base
De decimal a octal (120 es el decimal)
De decimal a hexadecimal
o (si queremos la letra en minúscula)
De base A (hasta 16) a base B (hasta la que queramos)
por ejemplo, para pasar de hexadecimal a binario:
o para pasar de binario a decimal:
Generar una secuencia de números
Generar una secuencia del 1 al 100:
Generar una secuencia del -50 al 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
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.
Actualizado el 07/07/2016, corregido un < que no se visualizaba en una parte del post.
Actualizado el 04/11/2016, ahora los ejemplos utilizan el plugin SimTerm para ser más visuales.
Actualizado el 07/09/2017, por un bug en WordPress, una consola no se veía bien. Arreglado.
The post Magia en Bash 50 ejemplos en una sola linea (o dos) appeared first on Poesía Binaria.