Llevas tres lecciones escribiendo 2>/dev/null, | y > sin que nadie te haya explicado del todo qué son. Los has copiado porque funcionan. Esta lección desmonta la mecánica, y es probablemente la más importante del módulo: la redirección y las tuberías son el mecanismo con el que la filosofía Unix del Módulo 1 —programas pequeños que hacen una cosa bien y se componen— pasa de ser una frase bonita a ser algo que se teclea.

No es un tema donde baste con memorizar símbolos. Hay un puñado de casos —2>&1 >fichero frente a >fichero 2>&1, el código de salida de una tubería, sudo echo x > /etc/...— en los que la intuición engaña y todo el mundo se equivoca al menos una vez. Vamos a por ellos con el detalle suficiente para que no te pase.

Contenido

  1. Los tres flujos estándar y por qué existen
  2. Verlos de verdad en /proc
  3. Redirección de salida
  4. Redirección de entrada
  5. Redirección de error y el orden de evaluación
  6. Los archivos especiales de /dev
  7. Here-documents y here-strings
  8. Tuberías: qué son realmente
  9. El código de salida de una tubería
  10. tee y el patrón | sudo tee
  11. Buffering: cuando la salida no aparece
  12. Componer una tubería paso a paso

  1. Los tres flujos estándar y por qué existen

Todo proceso en Linux nace con tres canales ya abiertos. No son una convención de Bash: los abre el sistema y están identificados por un número, el descriptor de archivo.

Descriptor Nombre Por defecto apunta a Para qué sirve
0 stdin el teclado entrada de datos
1 stdout la pantalla resultados del programa
2 stderr la pantalla mensajes de error y diagnóstico

La pregunta interesante es por qué hay dos canales de salida si ambos van a la pantalla. La respuesta es la clave de todo el diseño: para poder separarlos cuando hace falta. Si el resultado y los errores viajaran por el mismo canal, no podrías guardar en un fichero solo lo útil, ni encadenar un programa con otro sin que los avisos contaminaran los datos.

operador@srv-tramontana:~$ ls /var/log/tramontana /noexiste > /tmp/salida.txt
ls: no se puede acceder a '/noexiste': No existe el archivo o el directorio
operador@srv-tramontana:~$ cat /tmp/salida.txt
/var/log/tramontana:
acceso.log
errores.log

> redirigió solo stdout al fichero. El error se quedó en la pantalla porque viaja por stderr. Esa separación es deliberada y es lo que permite que un find que recorre /etc con avisos de permiso denegado siga produciendo una lista limpia.

flowchart LR
    T["teclado / fichero / tubería"] -->|"0 stdin"| P["proceso<br/>(p. ej. grep)"]
    P -->|"1 stdout<br/>resultados"| S["pantalla / fichero / otro proceso"]
    P -->|"2 stderr<br/>errores"| E["pantalla / fichero / /dev/null"]

  1. Verlos de verdad en /proc

Como todo es un archivo, los descriptores se pueden mirar:

operador@srv-tramontana:~$ ls -l /proc/$$/fd
lrwx------ 1 operador operador 64 ago 18 12:04 0 -> /dev/pts/0
lrwx------ 1 operador operador 64 ago 18 12:04 1 -> /dev/pts/0
lrwx------ 1 operador operador 64 ago 18 12:04 2 -> /dev/pts/0
lrwx------ 1 operador operador 64 ago 18 12:04 255 -> /dev/pts/0

Los tres apuntan a /dev/pts/0, tu pseudoterminal. El 255 es de uso interno de Bash. Ahora fíjate en qué ocurre dentro de una redirección:

operador@srv-tramontana:~$ ls -l /proc/self/fd > /tmp/fds.txt 2>&1; cat /tmp/fds.txt
lr-x------ 1 operador operador 64 ago 18 12:06 0 -> /dev/pts/0
l-wx------ 1 operador operador 64 ago 18 12:06 1 -> /tmp/fds.txt
l-wx------ 1 operador operador 64 ago 18 12:06 2 -> /tmp/fds.txt

Los descriptores 1 y 2 ya no apuntan al terminal, sino al fichero. Redirigir no es una función del comando: es algo que Bash hace al proceso hijo antes de arrancarlo. Por eso funciona con cualquier programa, sin que el programa tenga que saber nada.

  1. Redirección de salida

Operador Efecto
> fichero stdout al fichero, truncándolo
>> fichero stdout al fichero, añadiendo al final
`> fichero`

> trunca el fichero antes de ejecutar el comando, y lo crea si no existe. Eso significa que un > sobre un fichero con datos los destruye aunque el comando falle después.

operador@srv-tramontana:~$ set -o noclobber
operador@srv-tramontana:~$ echo prueba > /tmp/fds.txt
bash: /tmp/fds.txt: no se puede sobreescribir el fichero existente
operador@srv-tramontana:~$ echo prueba >| /tmp/fds.txt

noclobber convierte > en una operación que falla si el destino existe, y deja >| como la forma explícita de decir «sí, sobrescribe». Es un buen ajuste para una sesión de trabajo en producción; consúltalo con set -o | grep noclobber y desactívalo con set +o noclobber. La convención del curso —copia .bak-$(date +%F) antes de tocar nada— y noclobber se refuerzan mutuamente.

  1. Redirección de entrada

< fichero conecta stdin al fichero. Muchos comandos aceptan el nombre del fichero como argumento, así que la diferencia parece cosmética. No lo es:

operador@srv-tramontana:~$ wc -l /home/operador/datos/reservas.csv
26 /home/operador/datos/reservas.csv
operador@srv-tramontana:~$ wc -l < /home/operador/datos/reservas.csv
26

Con <, el programa no conoce el nombre del fichero: solo recibe un flujo de bytes, y por eso no lo imprime. Es lo que quieres cuando el número va a alimentar otro cálculo. (26 líneas: la cabecera más los 25 registros.)

  1. Redirección de error y el orden de evaluación

Forma Qué hace
2> fichero stderr al fichero
2>> fichero stderr añadiendo
2>&1 «haz que 2 apunte adonde apunta ahora 1»
> fichero 2>&1 ambos al fichero
&> fichero ambos al fichero (atajo de Bash)
&>> fichero ambos, añadiendo
2>/dev/null descarta los errores

Aquí está el punto donde todo el mundo se equivoca. Bash procesa las redirecciones de izquierda a derecha, y 2>&1 no significa «une los dos flujos para siempre»: significa «copia el destino actual de 1 sobre 2». Es una fotografía del estado en ese instante.

operador@srv-tramontana:~$ ls /var/log/tramontana /noexiste > /tmp/ok.txt 2>&1
operador@srv-tramontana:~$ cat /tmp/ok.txt
ls: no se puede acceder a '/noexiste': No existe el archivo o el directorio
/var/log/tramontana:
acceso.log
errores.log

Paso a paso: > /tmp/ok.txt apunta 1 al fichero; después 2>&1 copia ese destino sobre 2. Los dos acaban en el fichero. Correcto.

operador@srv-tramontana:~$ ls /var/log/tramontana /noexiste 2>&1 > /tmp/mal.txt
ls: no se puede acceder a '/noexiste': No existe el archivo o el directorio
operador@srv-tramontana:~$ cat /tmp/mal.txt
/var/log/tramontana:
acceso.log
errores.log

Paso a paso: 2>&1 copia el destino actual de 1, que todavía es el terminal, sobre 2; después > /tmp/mal.txt mueve 1 al fichero, pero 2 se quedó apuntando al terminal. Resultado: el error sale por pantalla y solo la salida normal va al fichero. Es exactamente lo contrario de lo que la mayoría cree estar escribiendo.

La regla práctica: 2>&1 va siempre al final. Y si no necesitas compatibilidad con otros shells, &> fichero es inequívoco y no admite el error.

Hay un uso legítimo del orden «equivocado»: comando 2>&1 >/dev/null | grep algo envía solo los errores a la tubería y descarta la salida normal. Es raro, pero cuando lo necesitas es la única forma.

  1. Los archivos especiales de /dev

Archivo Qué es
/dev/null agujero negro: todo lo escrito se descarta; leerlo devuelve EOF
/dev/zero fuente infinita de bytes nulos
/dev/stdout, /dev/stderr, /dev/stdin los flujos del proceso, como rutas
/dev/urandom bytes aleatorios
/dev/full siempre da «disco lleno» al escribir (para probar errores)

2>/dev/null es el silenciador de ruido que ya usabas en 03-03. Úsalo con criterio: descarta todos los errores, incluidos los que sí querías ver. Si solo quieres ignorar los de permiso denegado, mejor filtrar que silenciar a ciegas.

/dev/stdout como ruta resulta útil cuando un comando exige un nombre de fichero y tú quieres su salida en la tubería, como tar -cf /dev/stdout. Y /dev/zero sirve para generar un fichero de tamaño conocido con el que probar una copia de seguridad:

operador@srv-tramontana:~$ dd if=/dev/zero of=/tmp/prueba.bin bs=1M count=10 status=none
operador@srv-tramontana:~$ ls -lh /tmp/prueba.bin
-rw-r----- 1 operador operador 10M ago 18 12:22 /tmp/prueba.bin

  1. Here-documents y here-strings

Un here-document alimenta stdin con texto escrito en la propia línea de comandos, hasta un delimitador.

operador@srv-tramontana:~$ cat <<FIN > /tmp/aviso.txt
Despliegue previsto para el $(date +%F)
Release activo: $(readlink /opt/tramontana/app)
FIN
operador@srv-tramontana:~$ cat /tmp/aviso.txt
Despliegue previsto para el 2026-08-18
Release activo: releases/3.2.1

Con el delimitador entre comillas simples no se expande nada:

operador@srv-tramontana:~$ cat <<'FIN'
El valor de $HOME no se expande, ni $(date +%F)
FIN
El valor de $HOME no se expande, ni $(date +%F)
Forma Expansión de $VAR y $(...)
<<FIN sí
<<'FIN' o <<"FIN" no
<<-FIN sí, y además elimina los tabuladores iniciales

La regla: entrecomilla el delimitador salvo que quieras expansión deliberadamente. Es lo mismo que la regla de las comillas de 03-01, aplicada a bloques.

Un here-string <<< es la versión de una sola línea, y evita el echo ... | que se escribe por costumbre:

operador@srv-tramontana:~$ grep -oE '[0-9]+' <<< "reserva 1012 por 340.50 euros"
1012
340
50

  1. Tuberías: qué son realmente

Una tubería no es un fichero temporal. Es un búfer en memoria del kernel —típicamente 64 KiB— con dos extremos: la salida estándar del proceso de la izquierda y la entrada estándar del de la derecha.

Y aquí está el punto que hay que entender: los dos procesos se ejecutan a la vez, no uno después del otro. El de la derecha empieza a consumir en cuanto hay datos. Si el búfer se llena porque el consumidor va más lento, el kernel duerme al productor hasta que haya sitio; si el búfer se vacía, duerme al consumidor. Esa sincronización automática es la razón de que puedas hacer cat fichero-de-50-GB | grep algo sin agotar la memoria.

operador@srv-tramontana:~$ grep 'ERROR 500' /var/log/tramontana/errores.log | wc -l
41

Dos procesos simultáneos. grep escribe en el búfer, wc lee de él, y ninguno de los dos sabe que el otro existe: uno cree escribir en la pantalla y el otro cree leer del teclado. Eso es exactamente lo que hace posible componer programas que nunca fueron diseñados para trabajar juntos.

La tubería solo transporta stdout. Los errores del comando de la izquierda siguen yendo a la pantalla. Para meterlos también en la tubería, |& (equivalente a 2>&1 |):

operador@srv-tramontana:~$ ls /noexiste | wc -l
ls: no se puede acceder a '/noexiste': No existe el archivo o el directorio
0
operador@srv-tramontana:~$ ls /noexiste |& wc -l
1

  1. El código de salida de una tubería

Por defecto, $? devuelve el código del último comando de la tubería. Los anteriores se pierden, y eso oculta fallos:

operador@srv-tramontana:~$ cat /noexiste | wc -l
cat: /noexiste: No existe el archivo o el directorio
0
operador@srv-tramontana:~$ echo $?
0

cat falló, pero wc terminó bien y la tubería informa de éxito. Un procedimiento que compruebe $? daría por buena una operación que no leyó nada.

El array PIPESTATUS guarda el código de cada elemento:

operador@srv-tramontana:~$ cat /noexiste | wc -l > /dev/null
operador@srv-tramontana:~$ echo "${PIPESTATUS[@]}"
1 0

Y set -o pipefail hace que la tubería devuelva el código del último comando que falló:

operador@srv-tramontana:~$ set -o pipefail
operador@srv-tramontana:~$ cat /noexiste | wc -l > /dev/null; echo $?
1

pipefail es imprescindible en scripts serios y lo verás integrado en set -euo pipefail en el Módulo 4. Aquí quédate con la idea: una tubería puede mentirte sobre su éxito, y sabes dos formas de que no lo haga.

  1. tee y el patrón | sudo tee

tee lee de stdin y escribe a la vez en stdout y en uno o más ficheros. Bifurca el flujo.

operador@srv-tramontana:~$ grep 'ERROR 500' /var/log/tramontana/errores.log \
    | tee /tmp/errores-500.txt | wc -l
41

Ves el recuento y además conservas las líneas en un fichero. Con -a añade en lugar de truncar, y con - como destino adicional puede duplicar a la pantalla en medio de una tubería, lo que la convierte en una excelente herramienta de depuración.

Por qué sudo echo x > /etc/... falla

operador@srv-tramontana:~$ sudo echo 'log_nivel=info' > /etc/tramontana/app.conf
bash: /etc/tramontana/app.conf: Permiso denegado

Parece contradictorio: hemos escrito sudo. La explicación está en el reparto de tareas. La redirección la ejecuta Bash, no sudo. Bash abre el fichero de destino antes de lanzar nada, y lo hace con los privilegios de operador, que no puede escribir en un fichero de root. El sudo afecta a echo, que es justo la parte que no necesitaba privilegios.

La solución es hacer que el proceso privilegiado sea el que escribe:

operador@srv-tramontana:~$ echo 'log_nivel=info' | sudo tee /etc/tramontana/app.conf > /dev/null

Ahora tee corre bajo sudo y es él quien abre el fichero. El > /dev/null final descarta la copia que tee manda a pantalla, que aquí no aporta nada. Y para añadir al final, | sudo tee -a, nunca >>, por el mismo motivo. Aplicado con la convención del curso:

operador@srv-tramontana:~$ sudo cp /etc/tramontana/app.conf /etc/tramontana/app.conf.bak-$(date +%F)
operador@srv-tramontana:~$ echo 'log_nivel=info' | sudo tee -a /etc/tramontana/app.conf > /dev/null
operador@srv-tramontana:~$ sudo diff -u /etc/tramontana/app.conf.bak-$(date +%F) /etc/tramontana/app.conf
@@ -6,3 +6,4 @@
 timeout_consulta=30
 log_nivel=debug
+log_nivel=info

El diff revela algo importante: hemos añadido una segunda clave log_nivel en lugar de corregir la existente. El fichero ahora tiene dos, y qué gana depende de cómo lo lea la aplicación. Este es el motivo por el que la convención exige el diff -u: no para admirar el cambio, sino para descubrir que no era el que querías. La corrección en sitio es trabajo de sed, en la lección siguiente.

  1. Buffering: cuando la salida no aparece

Un programa escribe en un búfer y solo vuelca cuando se llena o cuando termina. La biblioteca de C aplica una regla que sorprende: si stdout es un terminal, el búfer es por líneas; si es una tubería o un fichero, es por bloques de 4 KiB.

Consecuencia práctica: tail -F acceso.log | grep 'ERROR 500' puede no mostrar nada durante minutos, no porque no haya errores, sino porque grep está acumulando 4 KiB antes de soltarlos. Parece que la tubería está rota y funciona perfectamente.

operador@srv-tramontana:~$ tail -F /var/log/tramontana/acceso.log | stdbuf -oL grep ' 500 '

stdbuf -oL fuerza el búfer por líneas del comando siguiente. Alternativas: grep --line-buffered, awk con fflush(), sed -u. Recuerda que la convención del curso es tail -F y nunca -f en producción, porque -F sobrevive a la rotación del fichero.

  1. Componer una tubería paso a paso

El objetivo: las rutas con más errores 500 en acceso.log. Se construye por incrementos, verificando cada eslabón, igual que hacías con las regex.

operador@srv-tramontana:~$ wc -l < /var/log/tramontana/acceso.log
412
operador@srv-tramontana:~$ grep ' 500 ' /var/log/tramontana/acceso.log | wc -l
14
operador@srv-tramontana:~$ grep ' 500 ' /var/log/tramontana/acceso.log | head -2
2026-08-18 03:12:44 POST /reservas 500 ip=10.0.2.31 ms=30012
2026-08-18 03:12:58 POST /reservas 500 ip=10.0.2.77 ms=30008

De 412 líneas quedan 14. Ahora extraemos solo la ruta y agrupamos:

operador@srv-tramontana:~$ grep ' 500 ' /var/log/tramontana/acceso.log \
    | grep -oE ' /[^ ]+ ' | sort | uniq -c | sort -rn
      9  /reservas
      4  /reservas/pago
      1  /casas

Nueve de catorce en /reservas, y los ms=30012 de la muestra rozan los 30 segundos, que es exactamente el timeout_consulta=30 de app.conf. La tubería no ha dado un dato: ha dado una hipótesis —las consultas a la base de datos agotan el tiempo límite— que encaja con el conexiones_activas=200 que vimos en 03-03 y con el max_conexiones=200 configurado. Eso es lo que se le lleva a Marta.

Repasa la composición: grep filtra, grep -oE extrae, sort agrupa lo igual, uniq -c cuenta, sort -rn ordena por frecuencia. Cinco programas que no se conocen entre sí, encadenados por un búfer del kernel. Ninguno sabe hacer el informe; juntos, sí.

Errores Comunes y Consejos

  • Escribir 2>&1 antes de la redirección de salida. Es el error clásico. Va al final, o usa &>.
  • comando > fichero con el mismo fichero como entrada. sort datos.txt > datos.txt lo vacía: Bash trunca el destino antes de que sort lea. Usa sort -o datos.txt datos.txt o un temporal.
  • sudo comando > /fichero/protegido. La redirección la hace tu shell. Usa | sudo tee.
  • Fiarse de $? tras una tubería. Es el del último comando. Usa PIPESTATUS o pipefail.
  • Silenciar con 2>/dev/null por reflejo. Estás descartando también los errores que necesitabas. Míralos primero.
  • Creer que una tubería es secuencial. Los procesos corren a la vez; por eso funciona con ficheros enormes y por eso el buffering puede retrasar la salida.
  • Olvidar entrecomillar el delimitador de un here-doc. Si el texto contiene $ o comillas, se expandirá.
  • Consejo: intercala | tee /tmp/paso1.txt | en medio de una tubería larga para inspeccionar qué circula por ese punto sin romper la cadena.
  • Consejo: command | cat desactiva la salida en color y en columnas de muchos programas, porque detectan que no escriben a un terminal. Si te falta el color, --color=always lo fuerza.

Ejercicios

Ejercicio 1. Ejecuta un find sobre /etc como usuario normal, de modo que la lista de resultados quede en /tmp/hallazgos.txt y los errores de permiso en /tmp/fallos.txt, sin que nada salga por pantalla. Después cuenta cuántos errores hubo y explica por qué no habrías podido separarlos con &>.

Ejercicio 2. Añade la línea # revisado 2026-08-18 al final de /etc/tramontana/app.conf conservando la convención de copia previa y verificación posterior. Explica por qué sudo echo ... >> no sirve.

Ejercicio 3. Construye paso a paso una tubería que muestre las cinco direcciones IP con más peticiones en acceso.log, guardando a la vez el listado completo en /tmp/ips.txt. Verifica que el total de peticiones contadas coincide con las 412 líneas del fichero y explica qué harías si no coincidiera.

Soluciones

Solución 1.

operador@srv-tramontana:~$ find /etc -name '*.conf' > /tmp/hallazgos.txt 2> /tmp/fallos.txt
operador@srv-tramontana:~$ wc -l < /tmp/hallazgos.txt
187
operador@srv-tramontana:~$ wc -l < /tmp/fallos.txt
6
operador@srv-tramontana:~$ head -1 /tmp/fallos.txt
find: '/etc/ssl/private': Permiso denegado

Dos redirecciones independientes, cada flujo a su fichero, y la pantalla queda limpia. &> no sirve porque mezcla ambos flujos en un único destino, que es justo lo contrario de lo que pedía el enunciado. Los seis errores son directorios como /etc/ssl/private, legítimamente cerrados a un usuario normal: revisarlos en su propio fichero es mejor práctica que descartarlos con 2>/dev/null, porque un error inesperado ahí dentro sería una señal que no querrías perder.

Solución 2.

operador@srv-tramontana:~$ sudo cp -p /etc/tramontana/app.conf /etc/tramontana/app.conf.bak-$(date +%F)
operador@srv-tramontana:~$ echo '# revisado 2026-08-18' | sudo tee -a /etc/tramontana/app.conf > /dev/null
operador@srv-tramontana:~$ sudo diff -u /etc/tramontana/app.conf.bak-$(date +%F) /etc/tramontana/app.conf
@@ -7,3 +7,4 @@
 log_nivel=debug
 log_nivel=info
+# revisado 2026-08-18
operador@srv-tramontana:~$ sudo ls -l /etc/tramontana/app.conf
-rw-r----- 1 root tramontana 545 ago 18 12:41 /etc/tramontana/app.conf

sudo echo '...' >> /etc/tramontana/app.conf falla porque la redirección la ejecuta tu shell antes de invocar a sudo, y tu shell corre como operador, que no tiene permiso de escritura sobre un fichero 640 propiedad de root. El sudo se aplicaría a echo, que no necesita privilegio alguno para imprimir texto. Con | sudo tee -a, el proceso que abre el fichero es tee, y ese sí corre como root. El cp -p conserva permisos y propietario en la copia, y ls -l confirma que el original sigue siendo 640 root:tramontana: escribir con tee bajo sudo no ha cambiado la propiedad del fichero, porque tee escribe en el fichero existente en vez de crearlo de nuevo.

Solución 3.

operador@srv-tramontana:~$ grep -oE 'ip=[0-9.]+' /var/log/tramontana/acceso.log | wc -l
412
operador@srv-tramontana:~$ grep -oE 'ip=[0-9.]+' /var/log/tramontana/acceso.log \
    | sort | uniq -c | sort -rn | tee /tmp/ips.txt | head -5
    138 ip=10.0.2.77
     94 ip=10.0.2.31
     61 ip=10.0.2.44
     38 ip=10.0.2.52
     27 ip=10.0.2.18
operador@srv-tramontana:~$ awk '{s+=$1} END {print s}' /tmp/ips.txt
412

El primer comando es la verificación imprescindible: 412 coincidencias para 412 líneas, luego toda línea tiene exactamente un campo ip=. Si hubiera salido menos, habría líneas con otro formato que se estarían quedando fuera del informe en silencio; si más, alguna línea con dos IPs y un recuento inflado. En ambos casos habría que examinar las líneas discordantes con grep -vc 'ip=' antes de seguir, porque un informe construido sobre un supuesto no verificado es un informe que se puede desmentir.

tee bifurca: el fichero recibe el listado completo y head -5 se queda con el podio. La suma final con awk —que estudiarás en la lección siguiente— cierra el círculo: 412 de nuevo, así que ninguna petición se ha perdido ni duplicado por el camino. Y hay un hallazgo: 10.0.2.77 concentra 138 peticiones, un tercio del total y casi el 50 % más que la siguiente. Merece investigación.

Conclusión

Has pasado de copiar símbolos a entender por dónde circula cada byte.

  • Conoces los tres flujos estándar —stdin 0, stdout 1, stderr 2—, sabes por qué existen dos canales de salida, y los has visto de verdad en /proc/<pid>/fd.
  • Manejas >, >>, noclobber con >|, y <, sabiendo que con < el programa no conoce el nombre del fichero.
  • Tienes resuelto el error clásico: 2>&1 copia el destino actual de 1, se evalúa de izquierda a derecha y por eso va al final; &> es el atajo inequívoco.
  • Usas /dev/null, /dev/zero y /dev/stdout con criterio, sabiendo que silenciar errores a ciegas oculta los que sí importaban.
  • Escribes here-documents y here-strings, y entrecomillas el delimitador cuando no quieres expansión.
  • Sabes que una tubería es un búfer del kernel entre dos procesos que corren a la vez, que solo transporta stdout, y que |& incluye los errores.
  • No te fías del código de salida de una tubería: conoces PIPESTATUS y set -o pipefail.
  • Aplicas | sudo tee para escribir en ficheros protegidos, y sabes explicar por qué sudo echo x > /etc/... falla: la redirección la hace tu shell, no sudo.
  • Reconoces el buffering por bloques cuando un log no aparece en tiempo real y lo corriges con stdbuf -oL.
  • Y has compuesto una tubería incrementalmente hasta convertir 412 líneas de log en una hipótesis de diagnóstico defendible.

En esas tuberías han aparecido sort, uniq -c y hasta un awk sin explicar. Es la deuda que salda la siguiente lección. Procesamiento de Texto: cut, sort, uniq, sed y awk cierra el círculo que abrió la filosofía Unix del Módulo 1: el texto plano como interfaz universal entre programas. Aprenderás a recortar campos, ordenar por la columna que quieras, contar apariciones, transformar con sed sin destrozar el original, y agrupar y sumar con awk hasta sustituir media tubería por una sola orden. Al terminarla podrás entregarle a Marta el informe de facturación mensual de reservas.csv y el top de rutas con errores de acceso.log sin escribir una línea de código.

Curso de Linux: De Principiante a Administrador de Sistemas

Módulo 1: Introducción a Linux

Módulo 2: Comandos Básicos de Linux

Módulo 3: Habilidades Avanzadas en la Línea de Comandos

Módulo 4: Scripting en Shell

Módulo 5: Administración del Sistema

Módulo 6: Redes y Seguridad

Módulo 7: Temas Avanzados

Módulo 8: Proyectos Prácticos

© Copyright 2026. Todos los derechos reservados