Ordenar y filtrar archivos: comandos sort
, uniq
, cut
1. Comando sort
El comando sort
está diseñado para ordenar líneas en un archivo de texto. Funciona con cualquier formato de texto: desde texto plano hasta CSV. Por defecto, ordena las líneas en orden alfabético. Sin embargo, hay un montón de opciones que te permitirán hacer verdaderas maravillas.
Sintaxis básica
sort [opciones] archivo
Ejemplo simple
Supongamos que tenemos un archivo names.txt
con el siguiente contenido:
Charlie
Alice
Bob
David
Podemos ordenarlo alfabéticamente así:
sort names.txt
Resultado:
Alice
Bob
Charlie
David
Opciones clave de sort
Orden inverso
Si deseas ordenar las líneas en orden descendente, utiliza la opción -r
:
sort -r names.txt
Resultado:
David
Charlie
Bob
Alice
Ordenamiento numérico
Para números, el ordenamiento alfabético puede no funcionar correctamente. Por ejemplo, este es el contenido del archivo numbers.txt
:
10
2
5
1
El ordenamiento alfabético dará como resultado:
1
10
2
5
Pero con la opción -n
(ordenamiento numérico):
sort -n numbers.txt
El resultado será correcto:
1
2
5
10
Tolerancia a espacios
A veces las líneas tienen espacios al principio o al final. Para que sort
no se confunda, utiliza la opción -b
:
sort -b archivo_sucio.txt
Ejemplo
Supongamos que tenemos un registro de visitas a una página web visits.log
:
user2 15
user1 5
user3 30
user4 20
Queremos ordenar los usuarios por el número de visitas (la segunda columna). Esto se hace así:
sort -k2 -n visits.log
Dónde -k2
significa "usar la segunda columna para ordenar". Resultado:
user1 5
user2 15
user4 20
user3 30
2. Comando uniq
El comando uniq
elimina las líneas duplicadas en un archivo. Sin embargo, es importante recordar: solo funciona con duplicados consecutivos. Es decir, si las líneas idénticas aparecen en diferentes partes del archivo, primero debes ordenarlas.
Sintaxis básica
uniq [opciones] archivo
Ejemplo simple
Supongamos que tenemos un archivo colors.txt
:
red
green
green
blue
blue
blue
red
Si simplemente usamos uniq
:
uniq colors.txt
El resultado será:
red
green
blue
red
Eliminar duplicados inevitables
Primero, ordenamos el archivo:
sort colors.txt | uniq
Resultado:
blue
green
red
Opciones clave de uniq
Contar repeticiones
Si quieres saber cuántas veces aparece cada línea, usa la opción -c
:
sort colors.txt | uniq -c
Resultado:
3 blue
2 green
2 red
Ejemplo
En el archivo access.log
tenemos una lista de direcciones IP:
192.168.0.1
192.168.0.2
192.168.0.1
192.168.0.3
192.168.0.1
Queremos saber qué IP aparece más frecuentemente:
sort access.log | uniq -c | sort -rn
Resultado:
3 192.168.0.1
1 192.168.0.2
1 192.168.0.3
3. Comando cut
El comando cut
permite extraer partes específicas de las líneas, por ejemplo, columnas individuales en un archivo CSV o rangos de caracteres.
Sintaxis básica
cut [opciones] archivo
Ejemplo simple
Archivo data.csv
:
Alice,25,Developer
Bob,30,Designer
Charlie,22,Manager
Extraigamos solo los nombres (la primera columna):
cut -d',' -f1 data.csv
Resultado:
Alice
Bob
Charlie
Donde:
-d','
— delimitador (coma).-f1
— campo (columna) a extraer.
Opciones principales de cut
Seleccionar un rango de caracteres
Si nuestro archivo data.csv
tiene columnas de ancho fijo:
Alice 25 Developer
Bob 30 Designer
Charlie 22 Manager
Podemos extraer solo la edad (caracteres del 12 al 14):
cut -c12-14 data.csv
Resultado:
25
30
22
Seleccionar múltiples campos
Si tenemos un archivo log.csv
:
2023-01-01,INFO,Server started
2023-01-02,ERROR,Connection failed
2023-01-03,INFO,Server stopped
Seleccionemos solo la fecha y el nivel de logs (campos 1 y 2):
cut -d',' -f1,2 log.csv
Resultado:
2023-01-01,INFO
2023-01-02,ERROR
2023-01-03,INFO
4. Ejemplo práctico: Combinación de sort
, uniq
y cut
Tomemos un archivo de log con los siguientes datos:
user1,192.168.0.1
user2,192.168.0.2
user1,192.168.0.1
user3,192.168.0.3
user2,192.168.0.2
- Extraeremos las direcciones IP:
cut -d',' -f2 log.txt
- Quitaremos los duplicados y los contaremos:
cut -d',' -f2 log.txt | sort | uniq -c
- Ordenaremos por número de ocurrencias:
cut -d',' -f2 log.txt | sort | uniq -c | sort -rn
Resultado:
2 192.168.0.2
2 192.168.0.1
1 192.168.0.3
GO TO FULL VERSION