En un servidor Linux casi todo es texto: la configuración son archivos de texto, y lo que pasa queda escrito en los registros (logs), una línea por suceso. Cuando algo falla, la respuesta suele estar ahí, entre miles de líneas: quién entró, qué página no existe, qué error dio la aplicación.
En este tema aprendes a sacarla. Primero, a leer y buscar; después, lo que hace de la terminal una herramienta tan potente: encadenar órdenes pequeñas, cada una buena en una cosa, para que juntas respondan preguntas como “¿qué IP hace más peticiones?” en una sola línea.
Los ejemplos usan el servidor web de la empresa, srv-web. El registro de nginx
(access.log) guarda cada petición a la web así:
tecnico@srv-web:~$ head -n 2 access.log 10.20.1.61 - - [05/Oct/2026:09:01:12 +0000] "GET /index.html HTTP/1.1" 200 5120 "-" "Mozilla/5.0" 10.20.1.62 - - [05/Oct/2026:09:01:15 +0000] "GET /ofertas.html HTTP/1.1" 404 162 "-" "Mozilla/5.0"
De izquierda a derecha: la IP que pidió, la fecha, qué pidió (GET /index.html), el
código de la respuesta (200 es “bien”, 404 “no existe”, 500 “error del servidor”), los bytes
enviados y el navegador.
Leer y contar: cat, head, tail y wc
Ya conoces cat (el archivo entero), head (el principio) y tail (el final). Con -n les
dices cuántas líneas:
tecnico@srv-web:~$ tail -n 1 access.log 10.20.1.62 - - [05/Oct/2026:09:05:31 +0000] "GET /contacto HTTP/1.1" 200 2048 "-" "Mozilla/5.0"
En un registro, lo último es lo más reciente: tail es lo primero que se mira cuando algo acaba
de fallar.
wc (word count) cuenta líneas, palabras y bytes. Con -l, solo las líneas; en un
registro, eso son los sucesos (aquí, las peticiones):
tecnico@srv-web:~$ wc -l access.log 6 access.log
Ejercicio
Un vistazo a los registros
La web va lenta desde esta mañana. Antes de buscar nada, mira el registro de nginx: cuánto tiene, cómo empieza y cómo acaba.
Preparando la máquina…
Buscar dentro: grep
grep enseña solo las líneas que contienen un patrón. Es la orden que más vas a usar con
los registros:
tecnico@srv-web:~$ grep ERROR app.log 2026-10-05 09:01:47 ERROR pago rechazado por la pasarela 2026-10-05 09:04:02 ERROR no se pudo conectar con la base de datos
En la terminal, lo encontrado sale en rojo. Sus opciones de siempre:
-i(ignore case): sin distinguir mayúsculas.grep -i timeoutencuentra Timeout, TIMEOUT y timeout.-v(invert): al revés, las líneas que no lo contienen.grep -v INFOquita el ruido.-c(count): no enseña las líneas, dice cuántas hay.-n: con el número de línea delante.-r(recursive): busca en todos los archivos de una carpeta y sus subcarpetas, y dice en cuál está cada línea.-lenseña solo los nombres de los archivos.
tecnico@srv-web:~$ grep -i timeout app.log 2026-10-05 09:02:10 WARN Timeout al llamar a la pasarela 2026-10-05 09:05:12 WARN TIMEOUT de la base de datos
Si el patrón lleva espacios o caracteres especiales, va entre comillas: grep ' 404 ' access.log busca el 404 con un espacio a cada lado (el código, no un 404 que aparezca dentro de
otro número).
Ejercicio
Buscar dentro: grep
La tienda da errores. Su registro está en /var/log/tienda/app.log: busca en él lo que importa.
Preparando la máquina…
Tuberías y redirecciones
Cada orden escribe su resultado en pantalla (la salida). La barra |, la tubería
(pipe), hace que esa salida no vaya a la pantalla sino a la entrada de la orden siguiente.
Así, wc -l no cuenta las líneas del archivo, sino las que ha dejado pasar grep:
tecnico@srv-web:~$ grep ' 404 ' access.log | wc -l 2
Se pueden encadenar tantas como hagan falta: cada una hace una cosa y le pasa el resultado a la siguiente. Es la idea central de Linux.
Para guardar el resultado en un archivo en vez de verlo, están las redirecciones:
>escribe la salida en un archivo. Si ya existía, lo reemplaza (lo que tuviera, se pierde).>>la añade al final del archivo, sin borrar lo que había.
tecnico@srv-web:~$ grep ' 404 ' access.log > errores.txt
tecnico@srv-web:~$ grep ' 500 ' access.log >> errores.txt
tecnico@srv-web:~$ wc -l errores.txt 3 errores.txt
Al redirigir, la terminal no enseña nada: todo ha ido al archivo. Es lo que se hace con un informe que otro va a leer.
Ejercicio
Tuberías y redirecciones
Desarrollo quiere saber qué páginas no existen (código 404) y cuáles fallan (500). Cuéntalas y déjales las líneas en un archivo.
Preparando la máquina…
Ordenar y contar: sort y uniq
sort ordena las líneas. Sin opciones compara texto, carácter a carácter, y eso con números
sorprende:
tecnico@srv-web:~$ sort numeros.txt 10 100 9
Con -n ordena como números, y con -r, al revés (de mayor a menor). -u quita las líneas
repetidas.
tecnico@srv-web:~$ sort -nr numeros.txt 100 10 9
uniq quita las líneas repetidas que están seguidas; con -c delante de cada una dice
cuántas veces estaba. Como solo mira la línea anterior, casi siempre va detrás de un sort.
Juntas responden la pregunta de siempre, “¿quién aparece más?”:
tecnico@srv-web:~$ awk '{print $1}' access.log | sort | uniq -c 3 10.20.1.61 2 10.20.1.62 1 10.20.2.14
Paso a paso: awk '{print $1}' saca la primera columna (la IP; lo verás enseguida), sort pone
juntas las iguales y uniq -c las cuenta. Para quedarte con la que más, se ordena otra vez por
número, de mayor a menor, y se coge la primera línea:
tecnico@srv-web:~$ awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -1 3 10.20.1.61
Ejercicio
Ordenar y contar
Una sola máquina de la sede hace muchas más peticiones que las demás. ¿Cuál? La IP es la primera columna del registro de nginx.
Preparando la máquina…
Columnas: cut y awk
Muchos archivos son tablas: cada línea un registro, con sus campos separados por algo.
cut se queda con los campos que le pidas: -d dice qué los separa y -f, cuáles quieres. En
/etc/passwd, los campos van separados por dos puntos y el primero es el nombre de usuario:
tecnico@srv-web:~$ cut -d: -f1 /etc/passwd root tecnico
awk es más listo: separa por espacios (los que haya), y cada campo es $1, $2… $0 es la
línea entera, NF el número de campos y $NF el último. El programa va entre comillas simples
y entre llaves:
tecnico@srv-web:~$ awk '{print $6, $NF}' pedidos.log Acme 150.50 Beta 89.99 Acme 300.00 Gamma 12.25
Delante de las llaves puede ir una condición: solo se hace con las líneas que la cumplen. Las páginas que dieron 404 (el código es el campo 9):
tecnico@srv-web:~$ awk '$9 == 404 {print $7}' access.log /ofertas.html /ofertas.html
Y awk sabe sumar: va acumulando en una variable y, al terminar (END), la escribe. Lo que
se vendió el 4 de octubre:
tecnico@srv-web:~$ awk '$1 == "2026-10-04" {s += $NF} END {print s}' pedidos.log 540.49
print escribe los números con 6 cifras como mucho: una suma de 12 345,67 saldría como
12345.7. Para dinero, mejor printf "%.2f\n", s, que escribe siempre dos decimales.
Ejercicio
Columnas: cut y awk
Contabilidad pregunta por las ventas de la tienda, que están en /var/log/tienda/pedidos.log: una línea por pedido, con el importe al final.
Preparando la máquina…
Cambiar texto: sed y tr
sed edita texto línea a línea. Lo que más se usa es sustituir: s/lo-que-hay/lo-nuevo/.
tecnico@srv-web:~$ sed 's/db-vieja/db-nueva/' tienda.conf # Configuración de la tienda [base_de_datos] servidor=db-nueva.sede.local puerto=5432
Tres cosas que hay que saber:
- Sin más,
sedno toca el archivo: enseña cómo quedaría. Es la forma de probar el cambio. Cuando es el que quieres,-i(in place) lo guarda en el archivo. scambia solo la primera coincidencia de cada línea; con unagal final (s/vieja/nueva/g), todas.- También borra líneas:
sed '/^#/d'quita las que empiezan por#(los comentarios).^significa “al principio de la línea”, y$, “al final”.
tr cambia unos caracteres por otros (tr a-z A-Z pasa a mayúsculas) y con -d los borra.
tecnico@srv-web:~$ echo hola | tr a-z A-Z HOLA
Ejercicio
Cambiar texto: sed
La base de datos se ha mudado de db-vieja a db-nueva, y tienda.conf (en tu carpeta) sigue apuntando a la vieja.
Preparando la máquina…