¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Snippets CLI
Recetas útiles para la línea de comandos.
Ejecuta el último comando como root:
sudo !!
Sistema
Mostrar los 5 ficheros que más ocupan:
du -hs * | sort -rh | head -5
du -hs: muestra un total (s) del espacio ocupado por los directorios en formato humano (h)sort -rh: ordena líneas de forma decreciente (r) de forma numérica (h)head -5: muestra solo las 5 primeras líneas de resultado.
Mostrar sistemas de ficheros montados en columnas:
mount | column -t
Obtener dirección IP pública:
curl ifconfig.co
curl ifconfig.me
Cerrar la shell manteniendo sus procesos en funcionamiento:
^z; bg; disown
Lo que hacemos es suspender la ejecución del proceso actual (Ctrl + z), luego lo pasamos a segundo plano (bg) y finalmente eliminamos su asociación con la shell actual (disown)
Si sabemos de antemano que vamos a querer cerrar la shell tras ejecutar algún comando, deberíamos lanzarlo de alguna de las siguientes maneras:
comando & disown
El ampersand (&) hace que el comando se ejecute en segundo plano y disown lo desvincula de la shell actual (lo quita de su lista de trabajos).
La otra opción:
nohup comando
nohup separa directamente el proceso de la terminal por lo que al cerrar la terminal, no enviará una señal de detención a sus procesos.
- Difference between nohup, disown and & (StackExchange.com)
Copiar los permisos de un fichero a otro:
chmod --reference fichero1 fichero2
La opción --reference también se puede usar con los comandos chgrp y chown
Conectarse a un servidor SSH a través de un intermediario:
ssh -t hostA ssh hostB
Esto es útil si por ejemplo no tenemos acceso directo a hostB, pero sí a través de hostA. Hacemos todo en un único paso. Aunque se pudiese lograr lo mismo estableciendo un túnel, eso implicaría usar otros puertos (un puerto diferente por túnel)
Mostrar el tamaño de las particiones de disco:
lsblk --json | jq -c '.blockdevices[]|[.name,.size]'
Otra opción un poco más rápida y sin usar jq:
lsblk | grep -v part | awk '{print $1 "\t" $4}'
Mostrar la distribución Linux instalada:
cat /etc/*release
Alternativa básica:
cat /etc/issue
Si instalamos el programa lsb-release también podríamos verlo con:
lsb_release -a
Obtener la fecha de ayer
Día de ayer usando el comando date y con la salida formato AAAA-MM-DD:
date -d "yesterday 13:00" '+%Y-%m-%d'
Mostrar fecha de inicio de los procesos y duración
ps -eo pid,lstart,etime,args
Otros
Cronómetro:
time read
Cuando detengamos el proceso con Ctrl + D, se mostrará el tiempo que duró el proceso:
real 0m9.688s user 0m0.004s sys 0m0.000s
Mostrar un reloj en la esquina del terminal:
while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done &
Como se ejecuta como un proceso en segundo plano, para “matarlo” tendremos que saber su PID o trar el proceso a primer plano (fg) y detenerlo con Ctrl + c
Lista de comandos que más se han usado:
history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
Información del tiempo:
curl wttr.in/madrid
Ejecutar un comando un tiempo determinado:
timeout 5s ping www.google.es
El anterior comando ejecutará ping www.google.es durante 5 segundos y finalizará el proceso.
Otra opción podría ser usando sleep:
Si queremos que el comando se finalice correctamente (SIGINT), le pasaremos la opción -s: timeout -s 2 5s <COMANDO>. Para ver el listado de señales que le podemos pasar a -s, kill -l.
timeout pertenece a las coreutils.
Listado de todos los atajos de Bash:
bind -P
Si queremos mostrarlo de una forma más “agradable”:
bind -P | grep -v "is not" | sed -e 's/can be found on/:/' | column -s: -t
Simular que estás trabajando:
Que aparezca una ventana de progreso de una instalación falsa:
for i in {0..600}; do echo $i; sleep 1; done | dialog --gauge "Install..." 6 40
Para que funcione el comando anterior es necesario instalar dialog
Hacer que se muestre información hexadecimal desplazándose por la pantalla:
while [ true ]; do head -n 100 /dev/urandom; sleep .1; done | hexdump -C | grep "ca fe"
Enviar notificaciones al escritorio:
notify-send "Mensaje"
Podríamos hacer cosas como que nos avisase del fin de una descarga por wget:
wget https://www.debian.org/example.iso; notify-send "Descarga completada"
Otra opción usando zenity:
zenity --info --text="Mensaje"
Compartir un fichero por el puerto 80:
nc -v -l 80 < fichero.extension
Desde otro equipo que tenga acceso, abrir un navegador web y poner la IP del equipo que está compartiendo el fichero.
Necesita tener instalado netcat
Mostrar la jerarquí del sistema de ficheros Linux:
man hier
Muestra información sobre los directorios típicos de un sistema Linux (/, /bin, /home, /etc…), qué hay en ellos, para qué sirven…
Guardar la salida de un comando como imagen:
convert label:"$(ip a)" output.png
Abrir editor de texto para escribir un comando largo o complicado:
fc
Se abrirá el editor configurado en la variable $EDITOR, podremos escribir el comando que queramos y al guardar y salir, se ejecutará en la línea de comandos.
Podemos usar el siguiente atajo de teclado en bash para obtener lo mismo: Ctrl + x e (también es válido Ctrl + x Ctrl + e)
Ficheros
Convertir codificación de caracteres
Si queremos pasar un fichero en ISO-8859-1 a UTF-8 (Unicode):
iconv -f iso88591 -t utf8 fichero-iso88591 .txt > fichero-utf8 .txt
-f: codificación de origen-t: codificación de destino
Eliminar última línea
Para eliminar la última línea/fila de un fichero:
sed -i '$d' <fichero>
También podemos hacerlo con head y luego redirigir la salida a un nuevo fichero que ya no tendrá esa línea final:
head -n -1 <fichero> > <fichero_resultante>
-1: indicamos que la última línea no se muestre en la salida dehead
