Saltar al contenido
sudoquest@root
Linux

Texto y tuberías

Sacar de los registros lo que importa: leer, buscar, ordenar, contar y cambiar texto, y encadenar órdenes con tuberías y redirecciones.

25 min de lectura

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 timeout encuentra Timeout, TIMEOUT y timeout.
  • -v (invert): al revés, las líneas que no lo contienen. grep -v INFO quita 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. -l enseñ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, sed no 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.
  • s cambia solo la primera coincidencia de cada línea; con una g al 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…