Ghost AcademySecLearn// Seguridad Informática
🔎 Redirección y Procesamiento de Texto III · Ubuntu 24.04 · usuario atu
grep sed awk tr xargs
// Búsqueda, edición y procesamiento avanzado de texto en Linux

Tercera parte de la serie. Los cinco comandos más potentes para buscar patrones, editar flujos de texto, procesar columnas, transformar caracteres y construir pipelines avanzados. Con el archivo informe.log y ejemplos CSV.

grep · -i -v -n -r -c -E · regex sed · s/p/r/g · /p/d · -i · -n awk · $1 $2 NR FS · -F · cálculos tr · a-z A-Z · -d · -s xargs · -I{} · -n 1 · find+rm
📄
Archivo de Referencia — informe.log
El mismo informe.log de la Parte I. Se usa en todos los ejemplos de grep, sed y awk de esta guía.
/home/atu/informe.log
1Inicio del sistema a las 08:00:00
2Carga de módulos de red exitosa.
3Conexión a la base de datos establecida.
4Tarea programada (backup.sh) iniciada.
5[ERROR] Fallo al escribir en disco: Permiso denegado.
6Reintentando la operación de escritura...
7Tarea programada (backup.sh) finalizada con errores.
8Uso de CPU: 45%.
9Uso de RAM: 60%.
10Limpieza de archivos temporales.
11Usuario 'maria' ha iniciado sesión.
12Usuario 'pedro' ha iniciado sesión.
13[AVISO] Memoria disponible baja (10%).
14Monitoreando el rendimiento del sistema.
15Fin del informe diario.
🗺️
Resumen de los 5 Comandos
Comandos 11–15 de la serie — los más potentes para búsqueda, transformación y procesamiento de texto.
🔎
grep
Buscar líneas que coincidan con un patrón o regex.
✏️
sed
Editar flujos: sustituir, eliminar e insertar texto.
📊
awk
Procesar columnas, calcular totales y filtrar filas.
🔄
tr
Traducir, reemplazar o eliminar caracteres uno a uno.
⚙️
xargs
Construir y ejecutar comandos a partir de listas de entrada.
🔎
11. grep — Global Regular Expression Print
La herramienta fundamental para buscar texto o patrones (regex) dentro de archivos y mostrar las líneas que coinciden. Uno de los comandos más usados para filtrar información.

Sintaxis: grep [opciones] 'patrón' [archivo]

OpciónDescripción
-iIgnora mayúsculas/minúsculas en la búsqueda (case insensitive).
-vInvierte la coincidencia — muestra las líneas que NO coinciden con el patrón.
-nMuestra el número de línea donde se encontró la coincidencia.
-cMuestra solo el conteo del número de líneas coincidentes.
-rBusca de forma recursiva en todos los archivos de un directorio.
-lMuestra solo los nombres de archivos que contienen coincidencias.
-EUsa expresiones regulares extendidas (ERE) — permite +, |, ().

Ejemplos prácticos

11.1 Buscar errores en el log
Muestra solo la línea 5 — la que contiene el texto exacto "ERROR".
grep "ERROR" informe.log
11.2 Buscar sin distinguir mayúsculas
Encuentra "ubuntu", "UBUNTU", "Ubuntu"... todas las variantes en info.txt.
grep -i "ubuntu" info.txt
11.3 Mostrar número de línea
Resultado: 5:[ERROR] Fallo al escribir en disco...
grep -n "ERROR" informe.log
11.4 Contar líneas que NO son sesiones
-v excluye líneas con "ha iniciado sesión", luego wc -l cuenta las restantes.
grep -v "ha iniciado sesión" informe.log | wc -l
11.5 Buscar recursivamente en directorio
Busca "atu" en todos los archivos dentro de /home/atu/Documentos/.
grep -r "atu" /home/atu/Documentos/
11.6 Contar coincidencias en auth.log
Muestra cuántas líneas de /var/log/auth.log contienen "login".
grep -c "login" /var/log/auth.log
11.7 Expresión regular — líneas con mayúscula inicial
^[A-Z] = líneas que empiezan (^) con una letra mayúscula ([A-Z]).
grep -E "^[A-Z]" nombres.txt
💡 grep "CPU|RAM": Con -E (o egrep) puedes usar | como OR: grep -E "CPU|RAM" informe.log muestra las líneas 8 y 9.
✏️
12. sed — Stream Editor
Editor de flujo de texto. Principalmente para sustituir o eliminar líneas. Por defecto no modifica el archivo original — opera sobre el flujo de datos hacia stdout.

Sintaxis: sed [opciones] 'expresión' [archivo]

Anatomía del comando sed — sed '/DEBUG/d' log.txt
sed '/DEBUG/d' log.txt
sed
Stream Editor
Procesa el archivo línea por línea sin cargarlo entero en memoria.
/DEBUG/
Patrón de búsqueda
Selecciona todas las líneas que contengan "DEBUG". Las barras / / delimitan el patrón.
d
Comando delete
Elimina las líneas que coinciden con el patrón del flujo de salida.
log.txt
Archivo de entrada
El archivo a procesar. No se modifica salvo que uses -i.
Expresión / OpciónDescripción
s/patrón/nuevo/gSustituye patrón por nuevo. La g = reemplazo global en toda la línea. Sin g solo reemplaza la primera ocurrencia.
/patrón/dComando delete — elimina las líneas que contienen el patrón del flujo de salida.
-iModifica el archivo directamente (in place). Usar con precaución — no hay deshacer.
-n '1,5p'Suprime salida automática y muestra solo las líneas indicadas (p = print).
/patrón/a textoInserta texto después de cada línea que coincide con el patrón.
-ePermite encadenar varias expresiones en un mismo comando.

Ejemplos prácticos

12.1 Reemplazar primera ocurrencia en cada línea
Cambia solo el primer "error" de cada línea. La cuarta línea tiene dos errores — solo reemplaza el primero.
sed 's/error/éxito/' reporte.txt
12.2 Reemplazar todas las ocurrencias
Con /g reemplaza cada "error" que encuentre en cada línea.
sed 's/error/éxito/g' reporte.txt
12.3 Modificar directamente el archivo ⚠️
Cambia "pendiente" por "completado" de forma permanente en tareas.txt.
sed -i 's/pendiente/completado/g' tareas.txt
12.4 Eliminar líneas DEBUG del log
Muestra el log sin las líneas que contienen "DEBUG" — el archivo no se toca.
sed '/DEBUG/d' log.txt
12.5 Mostrar solo líneas 1 a 5
-n suprime la salida automática; p imprime explícitamente el rango indicado.
sed -n '1,5p' notas.txt
12.6 Insertar texto después de un patrón
Añade "Subtítulo agregado" después de cada línea que contenga "Título".
sed '/Título/a Subtítulo agregado' documento.txt
⚠️ sed -i sin copia de seguridad: El flag -i modifica el archivo de forma irreversible. Haz siempre una copia antes: cp archivo.txt archivo.txt.bak. En macOS, usa sed -i '' (con comillas vacías).
📊
13. awk — Procesamiento por Columnas
Lenguaje de procesamiento de texto increíblemente potente para analizar datos columnares y realizar cálculos. Trabaja línea por línea y campo por campo.

Sintaxis: awk 'patrón { acción }' [archivo]

$0
Toda la línea actual completa.
$1 $2 $3…
Campo 1, 2, 3… de la línea actual (separados por FS).
FS
Field Separator — separador de campos. Por defecto: espacio/tabulador.
NR
Number of Record — número de línea actual. END{} lo usa para total de líneas.

Ejemplos prácticos

bash — crear ventas.txt para los ejemplos
echo -e 'Producto Precio Cantidad\nManzanas 2.5 10\nPeras 3.0 5\nBananas 1.8 12' > ventas.txt
13.1 Mostrar una columna específica
Imprime solo la primera columna (Producto) de cada línea.
awk '{print $1}' ventas.txt
13.2 Mostrar varias columnas
Imprime el Producto y el Precio separados por espacio.
awk '{print $1, $2}' ventas.txt
13.3 Calcular total por fila
Multiplica Precio × Cantidad y muestra el producto con su total.
awk '{total=$2*$3; print $1, total}' ventas.txt
13.4 Filtrar filas por condición
Muestra solo los productos con precio mayor que 2.
awk '$2 > 2 {print $1, $2}' ventas.txt
13.5 Calcular suma total con END
END{} se ejecuta una vez al final — calcula la suma acumulada de todas las filas.
awk '{suma+=$2*$3} END {print "Total:", suma}' ventas.txt
13.6 Delimitador personalizado con -F
-F ',' define la coma como separador — igual que cut -d ',' pero más potente.
awk -F ',' '{print $1, $3}' alumnos.csv
13.7 Calcular promedio con NR
NR al final vale el número total de líneas — úsalo como divisor para el promedio.
awk -F ',' '{suma+=$2} END {print "Promedio:", suma/NR}' datos.csv
13.8 Buscar patrón y formatear salida
grep filtra líneas de sesión → awk imprime "Bienvenido:" + el segundo campo ($2 = nombre).
grep "sesión" informe.log | awk '{print "Bienvenido:", $2}'
📌 awk vs cut: Usa awk cuando necesitas cálculos, condiciones o el separador son espacios múltiples. Usa cut para extracciones simples con delimitadores fijos como CSV.
🔄
14. tr — Translate Characters
Traduce (reemplaza) o elimina caracteres individuales. Solo funciona con stdin — siempre se usa con una tubería o redirección. No acepta nombre de archivo como argumento.

Sintaxis: tr [opciones] SET1 [SET2]

a-z → A-Z
Rango de caracteres. Convierte minúsculas a mayúsculas.
-d 'chars'
Delete — elimina todos los caracteres del SET1.
-s ' '
Squeeze — comprime repeticiones consecutivas en una sola.

Ejemplos prácticos

14.1 Convertir texto a MAYÚSCULAS
Transforma cada letra minúscula en su mayúscula correspondiente.
cat informe.log | tr 'a-z' 'A-Z'
14.2 Convertir a minúsculas
Útil para normalizar texto antes de comparaciones.
echo "HOLA MUNDO" | tr 'A-Z' 'a-z'
14.3 Eliminar caracteres específicos
Elimina todos los paréntesis del log (ej: de "(backup.sh)").
cat informe.log | tr -d '()'
14.4 Eliminar todas las vocales
Resultado: solo consonantes y otros caracteres.
cat texto.txt | tr -d 'aeiouAEIOU'
14.5 Reemplazar espacios por guiones
Resultado: curso-linux-basico — útil para crear slugs o nombres de archivo.
echo "curso linux basico" | tr ' ' '-'
14.6 Comprimir espacios múltiples
-s sustituye secuencias de espacios consecutivos por un único espacio.
cat texto.txt | tr -s ' '
⚠️ tr solo opera sobre stdin: A diferencia de grep, sed y awk, tr no acepta nombres de archivo como argumento. Siempre debes usar cat archivo | tr ... o tr ... < archivo.
⚙️
15. xargs — Execute Arguments
Toma elementos de stdin y los pasa como argumentos a otro comando. Esencial cuando un comando genera una lista (ej: find) y necesitas pasarla a otro comando que no acepta pipes.

Sintaxis: comando | xargs [opciones] [comando_destino]

find / ls / grep
Genera una lista de elementos (archivos, líneas, nombres).
›
xargs
Toma cada elemento de stdin y lo convierte en argumento del comando siguiente.
›
rm / cp / wc…
Recibe los argumentos y ejecuta la acción sobre cada uno.
OpciónDescripción
-I {}Reemplaza el placeholder {} por cada elemento de entrada. Útil para comandos que requieren la posición del argumento.
-n 1Ejecuta el comando una vez por cada elemento de entrada (en lugar de pasarlos todos juntos).

Ejemplos prácticos

15.1 Borrar todos los archivos .log
ls lista los .log → xargs pasa la lista completa a rm como argumentos.
ls *.log | xargs rm
15.2 Buscar y eliminar archivos .bak
find busca archivos .bak recursivamente → xargs los elimina todos.
find . -name "*.bak" | xargs rm
15.3 Contar líneas de varios archivos
Cada archivo .txt listado por ls se pasa a wc -l para contar sus líneas.
ls *.txt | xargs wc -l
15.4 Copiar archivos con placeholder {}
-I {} reemplaza {} con cada nombre de archivo encontrado por find.
find . -name "*.txt" | xargs -I {} cp {} /home/atu/backup/
15.5 Ver contenido de archivos que contienen ERROR
grep -rl lista archivos con "ERROR" → xargs cat muestra su contenido completo.
grep -rl "ERROR" /var/log | xargs sudo cat
15.6 Ejecutar un comando por cada elemento
-n 1 ejecuta echo una vez por archivo, en lugar de pasar todos juntos.
ls archivos* | xargs -n 1 echo "Procesando:"
🚨 Cuidado con xargs rm: find . | xargs rm puede borrar archivos de forma irreversible. Prueba siempre primero con xargs echo para ver qué se va a eliminar antes de usar rm.
🔗
Combinaciones Avanzadas
La potencia real surge al encadenar estos comandos en pipelines complejos.
bash — pipelines avanzados grep · sed · awk · tr · xargs
# Filtrar errores → eliminar corchetes → mostrar solo el mensaje
grep "ERROR" informe.log | sed 's/\[ERROR\] //' | tr 'a-z' 'A-Z'

# Extraer nombres de usuario del log y mostrar únicos
grep "sesión" informe.log | awk '{print $2}' | tr -d "'" | sort | uniq

# Reemplazar comas por tabulaciones en CSV y calcular promedio
cat datos.csv | tr ',' '\t' | awk '{suma+=$2} END {print "Promedio:", suma/NR}'

# Buscar archivos con ERROR y guardar un resumen formateado
grep -rn "ERROR" /var/log/ | awk -F':' '{print $1, "línea", $2}' | tee errores_resumen.txt

# Normalizar texto: quitar acentos implícitos, comprimir espacios, a minúsculas
cat notas.txt | tr -s ' ' | tr 'A-Z' 'a-z'

# Encontrar y procesar archivos .conf con xargs + sed
find /etc -name "*.conf" | xargs grep -l "#" | xargs -I{} sed '/^#/d' {}
📊
Tabla Resumen Comparativa
Los 5 comandos avanzados de procesamiento de texto de un vistazo.
ComandoFunción principalEjemplo típicoNota clave
grep Buscar texto o patrones grep -in "error" log.txt Usa -E para regex extendidas con |, +, ()
sed Sustituir o eliminar texto sed 's/viejo/nuevo/g' archivo.txt Sin -i no modifica el archivo. Con -i es permanente
awk Procesar columnas y calcular awk '{print $1, $2*$3}' datos.txt Usa -F para delimitador y END{} para totales
tr Convertir o eliminar caracteres cat texto.txt | tr 'a-z' 'A-Z' Solo funciona con stdin — siempre requiere pipe o redirección
xargs Ejecutar comandos sobre listas find . -name "*.log" | xargs rm Usa -I {} para controlar posición del argumento. Prueba con echo primero
🧪
Ejercicio Práctico Propuesto
Ejercicio que combina los 5 comandos de la guía con un archivo datos.csv simple.
bash — crear datos.csv
cat > datos.csv
Ana,25
Luis,32
Marta,29
Jose,32
# Ctrl+D para guardar
🧪 Ejercicios a completar
  1. Extrae solo los nombres con cut: cut -d ',' -f 1 datos.csv
  2. Filtra los que tienen edad "32": grep "32" datos.csv
  3. Reemplaza comas por tabulaciones: cat datos.csv | tr ',' '\t'
  4. Calcula el promedio de edad:
    awk -F ',' '{suma+=$2} END {print "Promedio:", suma/NR}' datos.csv
  5. Guarda el promedio en un archivo:
    awk -F ',' '{suma+=$2} END {print "Promedio:", suma/NR}' datos.csv | tee resumen.txt
  6. Bonus — sed: Reemplaza "pendiente" por "hecho" en un archivo de tareas:
    sed 's/pendiente/hecho/g' tareas.txt
  7. Bonus — xargs: Muestra el contenido de todos los archivos .csv del directorio:
    ls *.csv | xargs cat
  8. Bonus — pipeline completo: Busca nombres que empiecen con mayúscula, conviértelos a minúsculas y guárdalos:
    grep -E "^[A-Z]" datos.csv | tr 'A-Z' 'a-z' | tee minusculas.txt
📌 La serie completa: Con las tres guías de Redirección y Procesamiento de Texto dominas los 15 comandos esenciales: cat less more head tail (Parte I) · cut sort uniq wc tee (Parte II) · grep sed awk tr xargs (Parte III).