La funcionalidad de Linux no se limita a ls y grep
. Seguro que ya has usado estas herramientas para búsquedas rápidas y soluciones sencillas, pero eso solo es una pequeña parte de las capacidades del sistema operativo. La mayoría de las distribuciones de Linux contienen muchas herramientas integradas que no se ven a simple vista. Pero si investigas un poco, descubrirás que Linux incluye una serie de programas especiales para realizar diversas operaciones: desde simples manipulaciones de texto hasta complejas ingenierías de tráfico de red.
Si buscas programas o tutoriales para aprender Linux, seguro que encontrarás excelentes materiales sobre los fundamentos del sistema operativo. Sin duda, deberías aprender a usar comandos clave de navegación en la línea de comandos como cd
y ls
, pero Linux ofrece muchas más posibilidades sin necesidad de herramientas externas o lenguajes de programación.
Los ingenieros de software, sin pensarlo mucho, recurren directamente a un lenguaje de programación de alto nivel cuando creen que no pueden hacer algo con los programas y tuberías disponibles. Claro, en la mayoría de los casos es más fácil y rápido cambiar a otro lenguaje, como Python, pero ¿por qué no considerar las opciones para lograr el mismo resultado sin él? Te ahorras una gran dependencia, el lenguaje de programación y garantizas una gama más amplia de compatibilidad. No hay garantía de que en los diferentes sistemas con los que interactúes esté disponible la versión requerida del lenguaje. Además, algunos sistemas no permiten la instalación de ciertas herramientas. Al aprender a trabajar con las herramientas nativas del sistema operativo, desarrollarás una habilidad eficaz útil para tu trabajo futuro.
#1. tc (Traffic Control)
Este es un conjunto de herramientas para controlar el tráfico de red dentro de Linux. tc
ofrece posibilidades asombrosas. Pero es erróneo pensar que la configuración de la administración del tráfico es un proceso simple. Sin embargo, comprender su esencia te permitirá controlar la ingeniería del tráfico directamente en Linux.
La guía en este recurso puede parecer poco práctica, pero en la Wiki de Debian hay un material mejor estructurado con la descripción de varias formas de usar tc
.
Con más frecuencia, tc
se usa para retrasar paquetes de la conexión de red. Con este programa puedes administrar los paquetes entrantes y salientes, retrasándolos o incluso eliminándolos por completo. Veamos un ejemplo relativamente simple con el uso de un retraso en una conexión de red. Primero, comprobemos los indicadores de ping con respecto a Google:
esgeeks@blog:~ $ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=13.6 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=10.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=15.5 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=117 time=13.8 ms
No está tan mal. Entre nosotros y Google hay un retraso de ~13.5 ms. Pero supongamos que queremos comprobar cómo funcionará la aplicación con un retraso mayor. En la práctica, se ha implementado el test de estrés de las aplicaciones en condiciones de conexión a Internet débil. Si no sabes cómo se comportará tu aplicación en esas condiciones de red no óptimas, es poco probable que puedas predecir cómo funcionará en otros casos.
Vamos a provocar un retraso de 100 ms con tc
:
sudo tc qdisc add dev eth0 root netem delay 100ms
esgeeks@blog:~ $ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=110 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=116 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=119 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=117 time=113 ms
¡Excelente! Ahora vemos que el retraso de 100 ms que simulamos se ha añadido al retraso anterior. No olvides eliminar esta desviación después de la prueba:
sudo tc qdisc del dev eth0 root
#2. whiptail
¿Alguna vez te has preguntado cómo se crean esos bonitos mensajes emergentes? Pues con whiptail
. Es una útil utilidad especializada para mostrar ventanas de diálogo directamente en el terminal. Quizás hayas notado que este mismo estilo se usa tanto en el proceso de instalación de Ubuntu como en otras instalaciones comunes realizadas desde la línea de comandos.
Whiptail
está ampliamente disponible e integrado en muchas distribuciones para un uso rápido y sencillo. Esta utilidad ofrece una amplia variedad de tipos de ventanas y campos de entrada de datos:
- Ventanas de mensajes;
- Ventanas de entrada de texto arbitrario;
- Ventanas de entrada de contraseña;
- Ventanas de selección “sí”/”no”;
- Ventanas de menú con selección múltiple;
- ¡Y otras opciones!
Con whiptail
, intentemos crear una sencilla ventana de selección “sí”/”no” en la línea de comandos:
whiptail --yesno "¿Deseas continuar?" 10 40
Este caso de uso de whiptail
con la opción --yesno
no presenta ninguna dificultad. Pasas el tipo de ventana, su tamaño y el texto del mensaje para mostrarlo en pantalla. El resultado debería ser similar a este:

Para ver el valor devuelto al seleccionar “sí” o “no”, puedes mostrar en la consola el resultado del último comando ejecutado. Si simplemente escribes echo $?
, verás 0 en caso de “sí” o 1 al elegir “no”. Esto se puede integrar fácilmente en un script de línea de comandos de la siguiente manera:
#!/bin/bash
whiptail --yesno "¿te gustaría continuar?" 10 40
RESULT=$?
if [ $RESULT = 0 ]; then
echo "has pulsado sí"
else
echo "has pulsado no"
fi
#3. shred
¿Cuándo fue la última vez que eliminaste un archivo en Linux? ¿Cómo lo hiciste? ¿Lo eliminaste con rm y te olvidaste? Si el archivo contenía datos confidenciales, antes de rm
, deberías haberlo pensado bien. Para estas situaciones existe shred
. Esta pequeña utilidad borra realmente un archivo sobrescribiendolo varias veces con datos aleatorios.
Al eliminar un archivo con el comando rm
, en realidad solo eliminas la “referencia” o su índice conocido por el sistema operativo. El archivo desaparece, por lo que ya no lo ves, pero durante un tiempo sus datos originales aún se almacenan en el disco duro del sistema. Esos datos se pueden recuperar con procedimientos especiales. Usando shred
, puedes estar seguro de que el archivo se eliminará de verdad, lo que te evita tener que quemar el ordenador.
Puedes encontrar más información sobre shred
aquí.
La próxima vez que quieras eliminar un archivo irreversiblemente, ejecuta este comando (el flag -u
elimina realmente el archivo actual, en lugar de solo borrar su índice).
shred -u <archivo>
#4. split
En comparación con un comando similar en un lenguaje de programación de alto nivel, split
en Linux se distingue por su simplicidad, eficiencia y flexibilidad. Divide un archivo en cualquier cantidad de características especificadas: desde el número de líneas hasta el tamaño en bytes. Con el comando split
, no tienes que limitar tus operaciones solo a la separación de líneas o a sus interrupciones.
Veamos cómo dividir un archivo que contiene 4 líneas. Supongamos que queremos hacerlo después de la línea 2. Usaremos echo
para crear un archivo de prueba, y split
hará el resto:
echo -e "línea1\nlínea2\nlínea3\nlínea4" > archivo_prueba
split --lines=2 ./archivo_prueba archivo_dividido_
cat archivo_dividido_aa && cat archivo_dividido_ab

En este caso, hemos creado 2 archivos nuevos a partir de un archivo de origen. El comando split
permite añadir un prefijo de nombre a los archivos de salida, lo que hemos hecho con el último argumento del comando. Para mayor claridad, los archivos divididos resultantes contienen los sufijos aa
y ab
.
split
te ofrece muchas posibilidades. Puedes dividir un archivo de registro grande cuando alcanza un tamaño o una longitud de línea determinada. El comando split
también te ayudará a delimitar tareas en archivos de texto para una mejor estructura y apariencia, dividiéndolos en base a un separador predefinido.
#5. nl
¿Te ha pasado alguna vez esto? Miras un archivo de registro u otra salida de texto simple y piensas:
“¡Con la numeración de líneas sería mucho mejor!”
La numeración de líneas facilita la lectura y el recuerdo del lugar en el texto o indica una sección específica. Manteniéndonos fieles al potencial de Linux, encontraremos una utilidad especial para resolver esta tarea. Con el comando nl
puedes numerar literalmente las líneas. Tomar cualquier texto en la entrada estándar produce el mismo resultado, pero con la numeración de líneas. Veamos:
esgeeks@blog:~ $ echo -e "uno\ndos\ntres"
uno
dos
tres
esgeeks@blog:~ $ echo -e "uno\ndos\ntres" | nl
1 uno
2 dos
3 tres
Incluso puedes ajustar un poco el campo de numeración y el carácter separador si prefieres otro formato:
esgeeks@blog:~ $ echo -e "uno\ndos\ntres" | nl -s ": " -w 1
1: uno
2: dos
3: tres

Se hace evidente lo útil que es al trabajar con archivos grandes que contienen cientos o incluso miles de líneas. La próxima vez que necesites numerar las líneas de un archivo, simplemente aplica nl
:
cat <archivo> | nl
Si te gusta less
para ver archivos grandes, al abrir un archivo simplemente puedes pasar el argumento -N
para mostrar automáticamente los números de línea. Esto te evita tener que realizar operaciones adicionales con el archivo de origen y añadir números de línea, ya que less
no carga el archivo completo de inmediato.
#6. flock
Bloqueos. Tanto si te gustan como si no, tarde o temprano tendrás que lidiar con ellos. El concepto de bloqueo es bastante simple. Si necesitas realizar una operación con algún estado al que también pueden acceder otros procesos, esa operación debe bloquear todas las demás acciones hasta que finalice. En algunos casos, este proceso se realiza automáticamente; en otros, deberás establecer un simple sistema de bloqueos para evitar una condición de carrera.
Usando flock
, puedes crear diferentes tipos de bloqueos posibles durante las operaciones paralelas. Un bloqueo en sí mismo en Linux es simplemente un archivo. Veamos un ejemplo del uso de un bloqueo para evitar la interacción de varios procesos con un archivo:
esgeeks@blog:~ $ LOCKFILE=/tmp/archivo_bloqueo
esgeeks@blog:~ $ already_locked() {
echo "El bloqueo ya está en uso, saliendo"
exit 1
}
esgeeks@blog:~ $ exec 200>$LOCKFILE
esgeeks@blog:~ $ flock -n 200 || already_locked
esgeeks@blog:~ $ echo "Bloqueo obtenido, procediendo"
esgeeks@blog:~ $ sleep 10
esgeeks@blog:~ $ echo "Liberando bloqueo, finalizado"
Si ejecutas este script de línea de comandos, intentará obtener un bloqueo para el archivo /tmp/lockfile
, asignándole el descriptor de archivo 200 y luego usando el tipo de bloqueo “no bloqueante”. Con este tipo de bloqueo, si se obtiene, todas las demás intentos de obtenerlo fallarán en lugar de esperar a que se desbloquee.
Intenta ejecutar el script, que permanecerá inactivo durante 10 segundos, en una ventana, y luego, en otra ventana, ejecuta una copia. Verás que el primero obtiene el bloqueo, pero el segundo no, ya que ya está establecido. En este ejemplo, podrías reemplazar el simple comando sleep
por un conjunto de comandos de procesamiento de datos de larga ejecución o actualizaciones de un archivo que deba protegerse.
¡Gracias por tu atención! En las profundidades de Linux se esconde una increíble cantidad de utilidades sorprendentes listas para usar. Imagina lo interesante que será dominar completamente estos programas originales, así como comprender el propósito y la eficiencia de cada uno de ellos. La próxima vez que quieras saber más sobre las posibilidades disponibles, simplemente usa ls /usr/bin
y comienza tu investigación.