2.3 Tuberías (Pipes) y Redirecciones
tutorial.getReady
- Entenderás el concepto de
stdin,stdoutystderr(entradas y salidas estándar). - Sabrás cómo registrar la salida de los comandos en archivos usando
>y>>. - Aprenderás la esencia de Linux uniendo comandos complejos con Tuberías (
|). - Filtrarás datos masivos en segundos usando
grep,tailywc.
La Filosofía fundamental de Unix dictamina: “Escribe programas que hagan solo una cosa, pero que la hagan perfecta. Luego, escribe programas para trabajar juntos.”
Ninguna herramienta en Linux hace todo. En su lugar, el poder de un Sysadmin reside en usar legos (pequeños comandos aislados) y conectarlos entre sí.
1. Redirecciones: Controlando el flujo
Sección titulada “1. Redirecciones: Controlando el flujo"Normalmente, cuando ejecutas un comando, su resultado se imprime en tu pantalla. Podemos redirigir esta salida directamente a un archivo para guardar este resultado permanentemente.
Los Tres Flujos (Streams) Estándar
Sección titulada “Los Tres Flujos (Streams) Estándar"Cada proceso en Linux nace siempre con tres “tuberías invisibles” conectadas a él:
stdin(0): Entrada estándar. Por defecto es tu teclado.stdout(1): Salida estándar. El resultado exitoso de un comando. Por defecto es tu pantalla.stderr(2): Error estándar. Los mensajes de fallo. También salen por tu pantalla.
flowchart LR K["Teclado<br/>stdin (0)"] --> P["Proceso / Comando"] P --> O["Pantalla / Archivo<br/>stdout (1)"] P --> E["Pantalla / Archivo<br/>stderr (2)"]
Operadores de Redirección
Sección titulada “Operadores de Redirección"-
>(Redirigir Salida Estándar / Sobrescribir): Redirige elstdoutreemplazando todo el contenido previo del archivo si este ya existe. Si no existe, lo crea automáticamente.ventana terminal # Guarda el mensaje anulando el contenido anterior de registro.txtecho "Sistema iniciado" > registro.txt# Guarda la lista de archivos de tu directorio actualls -la > mis_archivos.txt -
>>(Añadir / Append): Redirige elstdoutagregando la salida al final del archivo sin tocar ni borrar el texto existente. Vital para sistemas de Logs o historiales.ventana terminal # Añade una nueva línea al final del archivoecho "Nueva alerta de seguridad: Intento de inicio de sesión fallido" >> registro.txt -
<(Redirigir Entrada Estándar): En lugar de usar el teclado para elstdin, toma el contenido de un archivo y se lo pasa a un comando.ventana terminal # El comando 'wc -l' (contar líneas) lee el contenido de registro.txt directamentewc -l < registro.txt -
2>(Redirigir solo Errores): Supongamos que escaneas un disco entero. La pantalla se llenará de aburridos errores “Permiso Denegado”. Puedes limpiar la vista enviando los errores a/dev/null(el agujero negro de Linux donde todo lo que entra desaparece).ventana terminal # Muestra los archivos encontrados (stdout por pantalla), pero oculta e ignora los errores (stderr a /dev/null)find / -name "*.conf" 2> /dev/null -
&>(Redirigir Salida y Errores Juntos): Si no te importa si el comando fue exitoso o falló, y quieres que absolutamente todo el resultado se guarde en un mismo archivo (o se silencie en/dev/null).ventana terminal # Guarda tanto los resultados de la búsqueda como los posibles erroresfind / -name "*.conf" &> resultado_completo.txt
2. Tuberías (| PIPES)
Sección titulada “2. Tuberías (| PIPES)"Aquí es donde Linux brilla. El operador de Tubería | toma la Salida Estándar (stdout) del comando a su izquierda, y la introduce como si la hubieras tecleado (Entrada Estándar / stdin) en el comando de la derecha.
comando1 | comando2 | comando3flowchart LR; A["cmd1"] -->|stdout| B["cmd2"]; B -->|stdout| C["cmd3"]; A -.->|"stderr (normalmente no pasa por pipe)"| S["stderr"];
Filtros Esenciales (Coreutils)
Sección titulada “Filtros Esenciales (Coreutils)"Los siguientes comandos están diseñados específicamente para brillar cuando se conectan detrás de un Pipe. Actúan como pequeños “filtros” que moldean los datos que reciben:
grep: El buscador universal. Filtra e imprime solo las líneas que contienen una palabra o patrón específico.ventana terminal # Lee un archivo inmenso, y solo imprime las líneas con la palabra "Error" o "Failed"cat /var/log/syslog | grep "Error"less: Paginador. Si la salida de un comando es de miles de líneas y abarrota tu pantalla destruyendo tu historial, ponle| lessy podrás navegarla cómodamente con flechas (presionaqpara salir).ventana terminal # Mira la lista de todos los procesos corriendo de forma paginada y controladaps aux | lesswc(Word Count): Cuenta bytes, palabras o, lo más útil y frecuente, líneas con la bandera-l(lines).ventana terminal # ¿Cuántos archivos y carpetas hay en el directorio de configuraciones?ls /etc | wc -lheadytail: Muestran sólo las 10 primeras (head) o las últimas (tail) líneas de texto de un flujo masivo. La bandera-npermite elegir la cantidad exacta.ventana terminal # Observa solo los últimos 20 logueos del sistemalast | tail -n 20sort: Ordena el texto resultante alfabéticamente o numéricamente. Agrega-rpara orden inverso y-npara números.uniq: Filtra y elimina las líneas duplicadas de un listado. Ojo: Requiere que los datos estén ordenados previamente (sort | uniq).awkysed: Herramientas súper potentes.awkextrae columnas de texto (ej:awk '{print $1}') ysedbusca y reemplaza patrones “al vuelo” a lo largo de flujos de texto inmensos.
3. Herramientas LFCS que multiplican los pipes
Sección titulada “3. Herramientas LFCS que multiplican los pipes"En examen, muchas tareas se vuelven triviales si dominas estos “conectores”.
tee (ver en pantalla y guardar a la vez)
Sección titulada “tee (ver en pantalla y guardar a la vez)"Si necesitas ver el resultado pero también guardarlo sin repetir el comando:
# Guarda y además muestra en pantallaps aux | grep nginx | tee /tmp/nginx_procesos.txtxargs (convertir líneas en argumentos)
Sección titulada “xargs (convertir líneas en argumentos)"Muchos comandos imprimen una lista (una ruta por línea). xargs toma ese flujo y lo convierte en argumentos para otro comando.
# Buscar .log y calcular tamaño total en bytesfind /var/log -type f -name "*.log" 2>/dev/null | xargs -r du -b | awk '{s+=$1} END{print s}'-r evita ejecutar el comando si no hay entradas (muy útil en scripts).
cut y tr (cortar columnas y transformar texto)
Sección titulada “cut y tr (cortar columnas y transformar texto)"Cuando trabajas con ficheros delimitados (por : en /etc/passwd, por espacios, etc.):
# Extraer el usuario (campo 1) y la shell (campo 7) de /etc/passwdcut -d: -f1,7 /etc/passwd | head
# Pasar a mayúsculas (útil para normalizar)echo "error" | tr '[:lower:]' '[:upper:]'Ejemplos Prácticos de Sysadmin
Sección titulada “Ejemplos Prácticos de Sysadmin"La verdadera magia de la consola de Linux ocurre cuando encadenas tres, cuatro o cinco comandos combinados como piezas de lego.
- Quiero ver solo las interfaces de red que están conectadas (“UP”):
ventana terminal # ip a muestra todas. grep filtra las conectadas.ip a | grep "state UP" - Quiero saber un recuento de cuántos puertos y servicios están escuchando en mi servidor:
ventana terminal # ss muestra la red, grep filtra lo que dice 'LISTEN', wc cuenta las líneas finalesss -tuln | grep "LISTEN" | wc -l - Top 5 de las direcciones IP que más intentan hackear el servidor SSH y fallan:
ventana terminal # cat lee toda la bitácora de auth.log, grep pilla los accesos fallidos,# awk extrae exactamente la columna de texto con la IP (suele ser la #11),# sort ordena las IPs para juntar las que son iguales,# uniq -c las recuenta agrupándolas,# sort -nr las re-ordena de mayor a menor con base en el nuevo recuento,# y head finaliza quedándose solo con las primeras 5.cat /var/log/auth.log | grep "Failed password" | awk '{print $11}' | sort | uniq -c | sort -nr | head -n 5 - Buscar archivos modificados recientemente y registrar el nombre en un archivo sin llenarse de errores en pantalla:
ventana terminal # Buscamos archivos en la raíz (/) modificados los últimos 7 días (-mtime -7).# Los errores de permiso (2>) se vuelcan a /dev/null y se ignoran.# La salida estándar buena fluye por la tubería (|) y es ordenada por 'sort',# y su resultado final se guarda temporalmente (>)find / -mtime -7 2> /dev/null | sort > /tmp/archivos_recientes.txt
Comprueba tus conocimientos
Sección titulada “Comprueba tus conocimientos"- Si quieres guardar un listado detallado de los archivos de un directorio
/var/logen un archivo llamadoinventario.logsin borrar de casualidad otra información importante que pudiera ya contener ese archivo, ¿qué operador usas?
- Ejecutas un comando engorroso que llena tu pantalla con cientos de líneas rojas de advertencia que no te importan, impidiendo que leas los resultados positivos porque se desplazan muy rápido. ¿Cómo ocultas los errores?
- Quieres listar tu directorio actual, pero dicho directorio contiene 15.000 fotos antiguas. Sólo quieres saber rápidamente y con exactitud cuántas imágenes hay en total. ¿Cómo combinas comandos para esto?