Curso de Linux / Procesar texto con grep, cut, sort, uniq y wc

Para encontrar las líneas necesarias en el texto, use grep, para ordenar las líneas use sort, para agrupar líneas duplicadas adyacentes use uniq, para extraer campos separados use cut, y para contar líneas, palabras o bytes use wc. Estos comandos envían los resultados a la salida estándar en lugar de modificar directamente los archivos, por lo que si se encadenan en orden, se pueden crear pequeñas tareas de procesamiento de texto.

Para relacionar los resultados de estos comandos con decisiones de ejecución, consulte los estados de salida y el flujo de ejecución del shell. Aquí se compara una entrada conocida con las líneas y los recuentos que produce cada etapa.

Crear datos de ejemplo

Este curso se basa en Bash y herramientas GNU. Si ~/linux-course-12-practice ya existe, elija otro nombre. Si la creación de un nuevo directorio falla, no continúe ejecutando los comandos posteriores de creación de archivos. > sobrescribe archivos existentes.

mkdir ~/linux-course-12-practice
cd ~/linux-course-12-practice
pwd

Después de verificar la ubicación actual, cree un archivo de cinco líneas con nombre y estado separados por dos puntos.

printf 'alpha:ready\nbeta:waiting\nalpha:done\ngamma:ready\nbeta:ready\n' > records.txt
cat records.txt

La salida de cat será igual a las cinco líneas que ingresó. Todos los ejemplos posteriores utilizan este archivo.

Buscar líneas coincidentes con grep

grep imprime las líneas que coinciden con un patrón. Si se añade -n, también se mostrará el número de línea del archivo original.

grep -n 'ready' records.txt

En este archivo, aparecen las tres líneas siguientes. waiting no incluye ready.

1:alpha:ready
4:gamma:ready
5:beta:ready

El patrón básico de grep es una expresión regular, por lo que al buscar caracteres especiales se debe verificar su significado. Si desea buscar la cadena tal como es, puede usar grep -F. Cuando no hay líneas que coincidan, normalmente se devuelve el estado de salida 1, y si el propio comando tiene un problema, se devuelve 2, así que no trate toda la 'falta de salida' como el mismo error.

Separar campos con cut y contar con wc

cut -d: -f1 imprime solo el primer campo usando dos puntos como separador. En el ejemplo siguiente, solo quedará el nombre.

cut -d: -f1 records.txt
alpha
beta
alpha
gamma
beta

cut separa campos mediante un delimitador simple; no interpreta reglas de CSV como separadores o saltos de línea dentro de campos entrecomillados. Para contar los saltos de línea del archivo, use wc -l: en este ejemplo devuelve 5 junto con el nombre. Una última línea sin salto final no añade otro salto al recuento.

wc -l records.txt

wc -w cuenta secuencias separadas por espacios en blanco, y wc -c, bytes. Las letras acentuadas o los alfabetos no ASCII pueden ocupar varios bytes en UTF-8. GNU wc -m cuenta caracteres según la configuración regional; no mide el ancho de lo que se ve en pantalla.

Conectar sort y uniq en ese orden

sort ordena las líneas. uniq agrupa solo las líneas idénticas consecutivas en una, por lo que si desea contar el mismo nombre que aparece separado, primero debe ordenar. La tubería | pasa la salida estándar del comando anterior a la entrada estándar del siguiente comando.

cut -d: -f1 records.txt | sort | uniq -c

En la salida, el número de veces por nombre es alpha 2 veces, beta 2 veces, gamma 1 vez. El espacio antes del número y el orden de clasificación pueden variar según la configuración regional y la implementación.

      2 alpha
      2 beta
      1 gamma

Si aplica sort | uniq a todas las líneas del archivo original, alpha:ready y alpha:done permanecen como líneas separadas. Primero decida “qué unidad considerar como duplicada” y luego recorte solo los campos necesarios. El resultado de la ordenación puede verse afectado por las reglas de comparación de caracteres de la configuración regional, por lo que al comparar resultados con otro sistema, también debe verificar la configuración regional.

¿Qué comando usar primero?

Objetivo Herramientas Condición clave
Línea que cumple con la condición grep Distinguir si el patrón es una expresión regular o literal
Organizar el orden de las líneas sort Verificar la configuración regional y el criterio de ordenación
Agrupar duplicados y contar uniq Los valores iguales deben estar adyacentes
Extraer campos delimitados simples cut Especificar el delimitador y el número de campo
Número de líneas, palabras y bytes wc Especificar qué contar como opción

Si el resultado está vacío o no es el esperado, primero verifique el original con cat records.txt y luego pruebe ejecutar una tubería larga dividida en cada etapa del comando. Así será más fácil encontrar en qué etapa (patrón, delimitador, ordenamiento) cambió el resultado.

Cambie solo una entrada para comparar los resultados. Después de agregar una línea beta a las cinco líneas originales de la carpeta de práctica y realizar el agregado, la cuenta de beta aumenta de 2 a 3 y el número total de líneas se convierte en 6. Al final, vuelva al contenido original de esta práctica y vuelva a calcular los recuentos.

printf 'beta:ready\n' >> records.txt
cut -d: -f1 records.txt | sort | uniq -c
wc -l records.txt
printf 'alpha:ready\nbeta:waiting\nalpha:done\ngamma:ready\nbeta:ready\n' > records.txt
cut -d: -f1 records.txt | sort | uniq -c
wc -l records.txt

Después de la restauración, deberían aparecer nuevamente alpha 2, beta 2, gamma 1 y un total de 5 líneas. La sobrescritura anterior aplica solo al records.txt creado para esta práctica en este curso.

Documentación oficial

El manual de GNU grep describe los patrones y estados de salida, y el manual de GNU Coreutils explica sort·uniq·cut·wc.