Archivos y texto
¿Qué es?
Esta lección trata de manipular archivos y texto desde la terminal: crearlos, copiarlos, moverlos, borrarlos y, sobre todo, leerlos y transformarlos. La idea central de Unix es que existen muchos programas pequeños, cada uno experto en una sola tarea, que se combinan entre sí. En lugar de buscar «la aplicación que haga X», aprendes a construir X uniendo piezas que ya tienes. Casi todo en la terminal es texto, y casi todo se puede conectar.
¿Cómo funciona?
Cada programa tiene tres canales: una entrada (stdin), una salida (stdout) y una salida de errores (stderr). Con la redirección (>, >>, 2>) envías esos canales a archivos, y con la tubería (|) conectas la salida de un programa directamente con la entrada del siguiente, formando cadenas. Comandos como cat, less, head y tail muestran contenido; grep y find buscan dentro o entre archivos; y un trío clásico (sort, uniq, cut, tr, sed) ordena, cuenta y transforma texto en cada eslabón de la cadena.
¿Para qué sirve?
Encadenar herramientas de texto es lo que convierte tareas tediosas en una sola línea: contar palabras, filtrar logs, limpiar listas o extraer columnas de un CSV. Esas mismas tuberías, una vez guardadas en un archivo, se vuelven los pequeños programas reutilizables de tu proyecto final «Tu kit de automatización personal». Aquí adquieres el vocabulario de piezas con las que más adelante armarás scripts que procesen tus notas, tus datos o tus registros sin esfuerzo.
En la terminal casi todo es texto, y casi todo se conecta. La idea central de Unix es: programas pequeños que hacen una cosa bien y se combinan por tuberías (pipes). Una vez la interiorizas, dejas de buscar "la app que haga X" y empiezas a construir X con piezas que ya tienes.
Crear, copiar, mover y borrar
mkdir reportes # crear un directorio
mkdir -p datos/2026/junio # -p crea toda la cadena de padres
touch reporte.txt # crear un archivo vacío (o actualizar su fecha)
cp reporte.txt copia.txt # copiar
cp -r reportes/ backup/ # -r para copiar directorios (recursivo)
mv copia.txt reporte_v2.txt # renombrar (o mover, es lo mismo)
mv reporte_v2.txt archivo/ # mover a otra carpeta
rm reporte.txt # borrar un archivo
rmdir reportes # borrar un directorio vacío
rm -r backup/ # borrar un directorio con contenido
rm no manda nada a la papelera: borra de inmediato y sin confirmación. rm -rf /ruta borra todo lo que cuelgue de esa ruta, recursivo y sin preguntar. Un espacio mal puesto (rm -rf / ruta o rm -rf ~ /algo) puede ser catastrófico. Antes de un rm -r, ejecuta primero el mismo patrón con ls para ver exactamente qué vas a borrar. Y nunca pruebes rm -rf "a ver qué pasa".
Usa rm -i para que te pida confirmación archivo por archivo cuando hagas limpiezas masivas. En macOS, brew install trash te da un trash que sí usa la papelera.
Ver el contenido de un archivo
cat archivo.txt # vuelca todo el contenido
less archivo.log # paginador: flechas para moverte, q para salir, /buscar
head archivo.csv # primeras 10 líneas
head -n 20 archivo.csv # primeras 20
tail archivo.log # últimas 10 líneas
tail -f servidor.log # sigue el archivo en vivo (logs en tiempo real)
wc -l archivo.txt # cuenta líneas
tail -f es oro para vigilar logs mientras algo se ejecuta. Lo cortas con Ctrl + C.
Tuberías y redirección: el corazón del shell
Cada programa tiene tres canales: entrada estándar (stdin), salida estándar (stdout) y salida de error (stderr). Puedes redirigirlos.
ls > listado.txt # redirige la salida a un archivo (lo SOBREESCRIBE)
ls >> listado.txt # añade al final del archivo (no borra)
comando 2> errores.txt # redirige solo los errores
comando &> todo.txt # redirige salida y errores juntos
La tubería | conecta la salida de un programa con la entrada del siguiente:
ls -l | wc -l # ¿cuántas entradas hay en esta carpeta?
cat acceso.log | grep "404" # solo las líneas con 404
history | grep git # qué comandos git he usado
Buscar dentro y fuera de los archivos
Dos herramientas distintas: grep busca texto dentro de archivos; find busca archivos por nombre o atributos.
grep "error" servidor.log # líneas que contienen "error"
grep -i "error" servidor.log # ignorar mayúsculas/minúsculas
grep -r "TODO" . # buscar en todos los archivos del árbol
grep -n "error" servidor.log # mostrar número de línea
grep -c "error" servidor.log # contar coincidencias
find . -name "*.md" # todos los .md desde aquí hacia abajo
find . -type d -name "node_*" # solo directorios que empiecen por node_
find . -name "*.log" -mtime +7 # logs modificados hace más de 7 días
En proyectos de código, ripgrep (rg) es mucho más rápido que grep -r y respeta tu .gitignore. Instálalo con brew install ripgrep o el gestor de tu distro.
Transformar texto: el trío clásico
sort nombres.txt # ordenar alfabéticamente
sort -u nombres.txt # ordenar y quitar duplicados
uniq -c # contar repeticiones (requiere entrada ordenada)
cut -d',' -f1 datos.csv # extraer la 1.ª columna de un CSV
tr 'a-z' 'A-Z' < f.txt # traducir minúsculas a mayúsculas
sed 's/viejo/nuevo/g' f.txt # reemplazar "viejo" por "nuevo" en cada línea
Ejemplo guiado: ranking de palabras de un texto
Vamos a contar las palabras más frecuentes de un archivo, encadenando piezas pequeñas.
# 1. Crea un texto de prueba
printf "el gato y el perro\nel perro corre\ngato gato\n" > texto.txt
# 2. Construye la tubería por etapas y observa cada una:
# 2a. Convertir espacios en saltos de línea -> una palabra por línea
tr ' ' '\n' < texto.txt
# 2b. Ordenar para agrupar palabras iguales
tr ' ' '\n' < texto.txt | sort
# 2c. Contar repeticiones consecutivas
tr ' ' '\n' < texto.txt | sort | uniq -c
# 2d. Ordenar por frecuencia, de mayor a menor
tr ' ' '\n' < texto.txt | sort | uniq -c | sort -rn
# Resultado:
# 4 gato ... (según tu texto)
# 3 el
# 2 perro
Cada etapa hace una sola cosa; el poder está en encadenarlas. Esta misma tubería, guardada en un script, podría analizar tus notas o tus logs: justo el tipo de tarea que automatizarás en el proyecto final.
Tech English: pipe (tubería), redirect (redirigir), stdin/stdout/stderr (entrada/salida/error estándar), pattern (patrón), recursive (recursivo), overwrite (sobreescribir), append (añadir al final).
Ejercicios
-
Diseña una tubería. Tienes un archivo
accesos.logdonde cada línea contiene una dirección IP al inicio, separada por espacios. Diseña (y explica etapa por etapa) una tubería que muestre las 5 IPs que más aparecen, con su conteo, ordenadas de mayor a menor. Piensa qué hace cada eslabón antes de escribirlo. -
Razona el riesgo. Explica con tus palabras por qué
rm -rf $CARPETA/es peligroso si la variable$CARPETAestá vacía o sin definir, y propón dos prácticas concretas (una conls, otra con comillas o validación) que reduzcan el riesgo antes de ejecutar un borrado masivo.