Aprende leyendo en orden

Herramientas de formateo de texto — sort / uniq / cut / wc / tr / tee

Este artículo forma parte del Curso de Linux, con el que dominarás desde cero habilidades prácticas de Linux, desde los comandos básicos hasta los scripts de shell.
Practica el orden con sort -n, el conteo de duplicados con sort | uniq -c, la extracción de columnas con cut -d',' -f1, el conteo de líneas con wc -l, la traducción tr 'a-z' 'A-Z' y la salida doble de tee, un comando a la vez con diagramas y terminal.

Ordenar líneas — sort

En este artículo practicarás seis comandos de formateo de texto, uno a la vez: sort / uniq / cut / wc / tr / tee. El primero es sort. Reordena las líneas de la entrada en orden lexicográfico (carácter por carácter). Usa sort -n para ordenar las líneas como números y sort -r para el orden descendente. En orden lexicográfico, 10 va antes que 2 (se comparan los primeros caracteres 1 y 2), así que ordenar números requiere -n.

FormaSignificado
sortOrdena las líneas en orden lexicográfico
sort -nOrdena las líneas por valor numérico
sort -rInvierte el orden (descendente)
sort es orden lexicográfico, sort -n es numérico
comparadocomo textosort10 2 30nums.txt10 2 30comparadocomo númerossort -n2 10 30
El orden lexicográfico compara los primeros caracteres: 10 va antes que 2. Añade -n para el orden numérico.
printf 'cherry\napple\nbanana\n' > words.txt   # crea un archivo de 3 líneas
sort words.txt                                   # apple banana cherry (orden lexicográfico)
sort -r words.txt                                # cherry banana apple (descendente)
printf '100\n9\n25\n' > scores.txt              # crea un archivo numérico
sort scores.txt                                  # 100 25 9 (el 1 va primero)
sort -n scores.txt                               # 9 25 100 (orden numérico)

① Crea un archivo de tres líneas numéricas con printf '10\n2\n30\n' > nums.txt.

② Ordénalo con sort nums.txt y comprueba que en orden lexicográfico 10 va antes que 2.

③ Añade a sort la opción de orden numérico y comprueba que el orden pasa a 2 → 10 → 30.

④ Después añade la opción de orden inverso y comprueba que las líneas salen de mayor a menor. (Si lo ejecutas correctamente, aparecerá una explicación.)

Linux console
0 / 4 completado(s)
Loading Linux Terminal...

Agrupar duplicados — uniq

uniq agrupa en una sola las líneas idénticas que están una junto a otra. Nunca mira los duplicados alejados, así que normalmente se ejecuta sort primero para juntar las líneas iguales y se le pasa el resultado por una tubería. Con uniq -c, cada línea queda precedida por su número de apariciones: un conteo por categoría al instante.

FormaSignificado
uniqAgrupa en una sola las líneas idénticas adyacentes
sort file.txt | uniqOrdena primero para agrupar también los duplicados alejados
uniq -cAntepone a cada línea su número de apariciones
Ordenar primero y agrupar con uniq
b a asorta b b (adyacentes)uniqabduplicadoseliminados
uniq solo ve los duplicados adyacentes: ejecuta sort primero para juntar las líneas iguales.
printf 'banana\napple\nbanana\napple\n' > items.txt   # crea un archivo de 4 líneas
sort items.txt                                          # apple apple banana banana
sort items.txt | uniq                                   # apple banana (duplicados eliminados)
sort items.txt | uniq -c                                # 2 apple / 2 banana (apariciones)

① Crea un archivo de cinco líneas con duplicados usando printf 'pear\nfig\npear\nfig\nfig\n' > fruit.txt.

② Ordénalo con sort fruit.txt y comprueba que las líneas idénticas quedan una junto a otra.

③ Pasa la salida de sort a uniq por una tubería y comprueba que los duplicados se agrupan en uno.

④ En la misma tubería, añade a uniq la opción de apariciones y comprueba que cada línea va precedida por su conteo.

Linux console
0 / 4 completado(s)
Loading Linux Terminal...

Extraer columnas — cut

cut divide cada línea según un delimitador y conserva solo los campos que pidas. El delimitador va después de -d y el número de campo después de -f, así que cut -d',' -f1 extrae la primera columna de un CSV. Para varios campos, enuméralos con comas como -f1,3. Es la herramienta para sacar solo las columnas que necesitas de un CSV o de un archivo de configuración separado por dos puntos.

FormaSignificado
cut -d',' -f1Extrae el campo 1 de líneas separadas por comas
cut -d':' -f1Extrae el campo 1 de líneas separadas por :
cut -d',' -f1,3Extrae los campos 1 y 3 juntos
cut divide por un delimitador y elige campos
cut -d',' -f1sato,30,tokyocampo 1satocampo 230campo 3tokyo-f1: solo satodividido en 3 por comas
La línea se divide por el delimitador de -d y solo se muestran los campos numerados en -f.
printf 'root:x:0\nuser:x:1000\n' > passwd.txt   # crea un archivo separado por dos puntos
cut -d':' -f1 passwd.txt                          # solo el campo 1 (los nombres)
cut -d':' -f1,3 passwd.txt                        # campos 1 y 3

① Crea un archivo separado por comas con printf 'sato,30,tokyo\nito,25,osaka\n' > people.csv.

② Usa cut con la coma como delimitador para extraer solo el campo 1 (los nombres).

③ Después extrae los campos 1 y 3 juntos y comprueba cómo se indican varios campos.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...

Contar líneas, palabras y bytes — wc

wc cuenta las líneas, palabras y bytes de su entrada. Sin opciones muestra los tres números; wc -l muestra solo el número de líneas, wc -w solo el de palabras y wc -c solo el de bytes. La que más usarás es wc -l: alimentada desde una tubería, como en ls | wc -l, responde preguntas como «¿cuántos archivos hay?» o «¿cuántas líneas coinciden?».

FormaSignificado
wcMuestra líneas, palabras y bytes juntos
wc -lMuestra solo el número de líneas
wc -wMuestra solo el número de palabras
wc -cMuestra solo el número de bytes
wc cuenta tres números
memo.txtgood morning / hellowc -lwc -wwc -c2 líneas3 palabras19 bytes
Misma entrada: la opción decide qué se cuenta.
printf 'one two three\nfour\n' > draft.txt   # crea un archivo de 2 líneas y 4 palabras
wc draft.txt                                  # líneas, palabras y bytes juntos
wc -l draft.txt                               # 2 (solo líneas)
ls | wc -l                                    # desde una tubería: cuenta los archivos

① Crea un archivo de dos líneas con printf 'good morning\nhello\n' > memo.txt.

② Ejecuta wc memo.txt y comprueba que aparecen tres números: líneas, palabras y bytes.

③ Añade la opción que muestra solo el número de líneas y comprueba que muestra 2.

④ Después añade la opción que muestra solo el número de palabras y comprueba que muestra 3.

Linux console
0 / 4 completado(s)
Loading Linux Terminal...

Traducir caracteres — tr

tr reemplaza los caracteres de la entrada estándar carácter por carácter. tr 'a-z' 'A-Z' convierte minúsculas en mayúsculas. tr -s comprime las repeticiones de un mismo carácter en uno solo (por ejemplo, espacios repetidos) y tr -d elimina los caracteres que indiques. tr no acepta un nombre de archivo como argumento: lee desde una tubería o una redirección de entrada.

FormaSignificado
tr 'a-z' 'A-Z'Convierte minúsculas en mayúsculas
tr -s ' 'Comprime los caracteres repetidos en uno solo
tr -d 'x'Elimina los caracteres indicados
tr traduce, comprime y elimina caracteres
hellotr 'a-z' 'A-Z'HELLOa b(3 espacios)tr -s ' 'a b(1 espacio)a-b-ctr -d '-'abc
De arriba abajo: traducción (minúsculas → mayúsculas), compresión de repeticiones (-s) y eliminación (-d).
echo 'hello linux' | tr 'a-z' 'A-Z'     # HELLO LINUX
echo 'a   b   c' | tr -s ' '            # comprime los espacios repetidos -> a b c
echo 'a-b-c' | tr -d '-'                # elimina - -> abc

① Pasa la salida de echo 'desktech learn' a tr por una tubería y convierte las minúsculas en mayúsculas.

② Después pasa la salida de echo 'x y z' a tr y usa la opción que comprime los espacios repetidos en uno solo.

③ Pasa la salida de echo 'a-b-c' a tr y usa la opción de eliminación para obtener abc.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...

Dividir la salida entre pantalla y archivo — tee

tee toma lo que recibe de la tubería, lo muestra en pantalla y lo escribe en un archivo al mismo tiempo. Úsalo cuando quieras un registro de los resultados intermedios sin dejar de pasar los datos al siguiente comando. Encadenado como comando | tee out.txt | siguiente comando, registra en out.txt mientras la tubería sigue su curso. Para añadir al final de un archivo existente en vez de sobrescribirlo, usa tee -a.

FormaSignificado
tee out.txtEscribe en pantalla y en el archivo (sobrescribe)
tee -a out.txtMuestra en pantalla y añade al final del archivo
tee envía la salida a pantalla y archivo
echo hi| tee out.txt| siguiente cmdhi en pantallahi tambiénen out.txtla tubería siguecat out.txthi sigue ahí
tee muestra en pantalla lo que recibe, lo escribe en el archivo y puedes comprobarlo después con cat.
ls | tee list.txt              # muestra el listado y lo guarda en list.txt
cat list.txt                   # también está en el archivo
echo 'extra' | tee -a list.txt # -a añade en vez de sobrescribir

① Pasa la salida de echo 'one two' a tee por una tubería para escribirla en note.txt, y comprueba que el mismo contenido aparece también en pantalla.

② Ejecuta cat note.txt para comprobar que el mismo contenido está también en el archivo.

③ Después añade la salida de echo 'three' al final de note.txt con la opción de añadir de tee.

④ Vuelve a ejecutar cat note.txt y comprueba que el archivo ha crecido a dos líneas.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Qué líneas trata uniq como duplicadas?

Pregunta 2¿Qué muestra cut -d',' -f1 users.csv?

Pregunta 3¿Qué ocurre al ejecutar echo hi | tee out.txt?