Apuntes mientras aprendo sobre software y computadoras.

Linux

Comandos para trabajar texto en la terminal de Linux

En este apunte voy a incluir algunos comandos que van a servirme para trabajar con texto en la terminal de Linux.

¿Trabajar con texto? ¿Qué quiero decir con eso? Me refiero por ejemplo a comparar palabras, unir oraciones, eliminar duplicados y tal vez algunas otras cosas.

Aunque estos comandos pueden parecer solo una curiosidad al principio, algo que no voy a usar todos los días, nunca esta de más conocerlos. Nunca se sabe cuando pueden resultar de utilidad.

Por otra parte, estos comandos no solamente funcionan con texto o archivos de texto. Con algo de creatividad se pueden usar para otras cosas.

Y ademas, este texto forma parte de un proyecto más grande. Originalmente fue una sección dentro de la “Guía básica para empezar con la terminal de Linux”.

Ahora decidí moverlo a su propia entrada, para facilitar su lectura.

Comparar textos con el comando cmp

La entrada del manual de este comando, en inglés, me dice que:

NAME
GNU cmp – compare two files byte by byte

manual de cmp

Y en mi traducción rápida, esto es que el comando cmp compara dos archivos byte por byte.

Entonces este comando se encarga de contrastar el texto de dos archivos, comparando cada uno de ellos carácter por carácter. Dicho de otro modo, no hace una comparación palabra por palabra o renglón por renglón. La hace moviéndose espacio por espacio, incluyendo los espacios vacíos.

Esto de revisar “letra por letra” es bastante… minucioso. En un caso donde se necesita que dos textos sean exactamente idénticos, esta herramienta es muy útil.

Voy a revisarlo con ejemplos. En su modo más básico, el comando va así:

cmp texto1 texto2

Esto es, en lugar de “texto1” y “texto2” van los nombres de los archivos que en necesitamos comparar. Y el resultado va a ser si los textos difieren o no, y en que carácter específico lo hacen.

Voy a repasar dos archivos que tengo en la computadora, se trata del “cuentoA” y “cuentoB”.

El archivo “cuentoA” contiene en su interior lo siguiente:

Este cuentoA
realmente es
Muy corto

Por su parte, el “cuentoB” dice:

Este cuentoB
realmente es
nuy corto

Ahora paso a compararlos, para ver en que se diferencian:

cmp cuentoA cuentoB

Y el resultado es:

cuentoA cuentoB son distintos: byte 12, linea 1

Y como no podía ser de otra manera, es cierto. Si me tomo el trabajo de contar, voy a notar que en el “espacio 12” de los dos cuentos hay una diferencia. Pero… ¿cuál es esa diferencia?

Para conocer exactamente que byte es distinto, tengo que agregarle al comando la opción “-b”

cmp -b cuentoA cuentoB
cuentoA cuentoB son distintos: el byte 12, en la línea 1 es 101 A 102 B

Perfecto, esa es la diferencia. En el espacio 12 del primero documento hay una letra A y en el segundo una letra B.

Pero me esta faltando algo. Todo esto dice que los dos archivos son diferentes una vez, pero no nos dice en todos los lugares que son distintos.

Para ver una lista completa de diferencias , agrego la opción “-l”

cmp -c -l cuentoA cuentoB
12 101 A 102 B
27 115 M 155 m

Y esto completa la diferencia que me estaba faltando. En el byte 27, el primer documento tiene una M mayúscula y el segundo documento tiene una m minúscula.

¿Y qué ocurre si los dos archivos son iguales? En ese caso, el comando cmp no me devuelve ninguna respuesta.

Ya casi termino con este comando, que no tiene demasiadas opciones pero hace bastantes cosas. Me interesa detenerme en dos alternativas, que pueden servir para hacer su uso más fácil.

Si agrego la opción -s el comando no va a entregar ninguna respuesta de salida directamente en la terminal (lo vuelve “silencioso”). Y si ademas le agrego el comando echo de este modo:

;echo $?

Ahora cmp va a mostrar tres posibles resultados: 0 si los archivos comparados son iguales, 1 si son diferentes y 2 si encuentra algún problema.

Voy a probarlo:

cmp -s CuentoA CuentoB; echo $?
1

Como bien sabía, la respuesta es 1 porque hay diferencias en la comparación.

¿Cuándo puede darnos un 2 por respuesta? Esto puede ocurrir por ejemplo cuando cometo un error al escribir el comando, o si equivoco el nombre de alguno de los archivos.

En resumen, cmp (compare) es muy versátil y seguro me estoy dejando algunas cosas afuera. Pero en estos primeros experimentos que hice noté que tiene mucho potencial… aunque como digo, todavía no lo puse en práctica para nada divertido.

Concantenar con el comando cat

Si reviso el manual de cat me dice:

NAME
cat – concatenate files and print on the standard output

manual de cat

En mi traducción directa: cat – concatenar archivos e imprimir el contenido en la salida estándar.

El comando cat quiere decir “catenate” o en castellano concatenar, que significa: “unir, enlazar, relacionar una cosa con otra”. Y si mal no entiendo, la salida estándar es la terminal.

Bastante apropiado, porque entre los usos de este comando encuentro por ejemplo el unir varios archivos juntos.

Pero también sirve para otras cosas, como mostrar el contenido de un documento en la terminal. Dicho de otro imprime el contenido del documento en la salida estándar.

Entonces en su forma más sencilla (por decirlo de algún modo), cat recibe texto y lo devuelve a la terminal.

Para hacer el experimento, utilizo el comando cat sin nada extra:

cat

Y puedo notar que la terminal queda esperando algo. Ahora si escribo algo, cualquier cosa, y luego presiono enter, el texto se va a repetir:

Escribí algo, cualquier cosa.
Escribí algo, cualquier cosa.

Para salir de este encierro en el que se detiene la terminal, tengo que presionar el combo de teclas “Ctrl + d”.

¿De qué me sirve esto? Puedo usar esta habilidad para que cat “almacene” datos, cosa que puede ser muy valiosa al momento de programar por ejemplo en bash.

También me sirve para crear documentos, redirigiendo la entrada de información que recibe cat hacia su salida en un nuevo archivo

Digamos que quiero crear un archivo llamado “texto1”. Hago:

cat > texto1

Y escribo:

Esto se trata del ejemplo número uno.

Cierro de nuevo presionando “Ctrl + d”. Ahora si llamo al recientemente archivo creador con cat, pero sin la re dirección:

cat ejemplo1

La terminal me devuelve:

Esto se trata del ejemplo número uno.

Por lo que también puedo usar el comando cat para conocer el contenido escrito dentro de un archivo, mostrándolo directamente en la terminal.

Algunos otros usos para el comando cat

Ahora voy a unir el texto de dos archivos distintos. Ya tengo el archivo “ejemplo1” y ahora voy a crear el archivo “ejemplo2”. Es cierto los nombres de los ejemplos no son muy originales.

Pero de todas maneras, uso cat para crear el archivo:

~$cat > ejemplo2
Y no podemos olvidarnos nunca de agregar el ejemplo dos.

Y ahora para empezar a “concatenar” con cat, hago:

~$ cat ejemplo1 ejemplo2

Esto se trata del ejemplo número uno.
Y no podemos olvidarnos nunca de agregar el ejemplo dos.

El comando me enseña el contenido de los dos archivos en la terminal.

La cosa se pone aún más útil, si conozco que puedo redirigir el contenido de varios documentos hacia un nuevo archivo, por medio de una re dirección:

~$ cat ejemplo1 ejemplo2 >ejemplo3

Puedo revisarlo escribiendo:

~$ cat ejemplo3

Esto se trata del ejemplo1.
Y no podemos olvidarnos nunca de agregar el ejemplo dos.

¿Y a donde van todos estos archivos de texto que estamos creando? Se encuentran en el directorio activo donde estoy trabajando, a menos que quiere crearlos en un lugar diferente.

Para cerrar, digamos que necesito agregarle una linea de texto extra a mi archivo “ejemplo3”. En ese caso, escribo en la terminal:

~$ cat >> ejemplo3
Casi me olvido de decir te encontrás leyendo el ejemplo 3.

Por medio de >> agrego la nueva linea dentro del archivo. Voy a revisar si todo fue bien:

~$ cat ejemplo3

Esto se trata del ejemplo1.
Y no podemos olvidarnos nunca de agregar el ejemplo dos.
Casi me olvido de decir te encontrás leyendo el ejemplo 3.

De una forma rápida, cat también me permite agregar información en un archivo ya creado con anterioridad.

Y el comando trae varias pequeñas opciones, por ejemplo “-n” numera todas las lineas de un archivo:

~$ cat -n ejemplo3

1 Esto se trata del ejemplo1.
2 Y no podemos olvidarnos nunca de agregar el ejemplo dos.
3 Casi me olvido de decir te encontrás leyendo el ejemplo 3.

Pero estas son solo algunas de las funciones de cat. Al igual que la mayoría de los comandos, cuanto más los combinamos con otros más poderosos y complejos se vuelven.

Ordenar archivos con el comando sort:

El manual del comando sort dice:

NAME
sort – sort lines of text files

manual del comando sort

En mi traducción rápida, esto es: sort se encarga de organizar las lineas dentro de un archivo de texto.

Para empezar, puedo utilizar sort para crear un nuevo documento. La diferencia es que al momento de agregar esta entrada en el documento, el comando lo incluye siguiendo un orden alfabético o numérico.

~$ sort >lista1

5
1
4
hola
ejemplo

Y cierro con “Ctrl + d” en el teclado. Acabo de crear el archivo “lista1” y le agregué un contenido. Si ahora reviso de nuevo el contenido de la lista:

~$ sort lista1

1
4
5
ejemplo
hola

Ahí puedo notar que el texto apareció ordenado: de menor a mayor y en orden alfabético.

Por seguro, también puedo usar sort para recibir de forma ordenada el contenido de archivos ya existentes.

Este comando tiene varias opciones. Por ejemplo, “-r” me presenta la lista en orden reverso:

~$ sort -r lista1

hola
ejemplo
5
4
1

En resumen, sort tiene varias formas de ordenar archivos. Su uso se hace evidente entonces cuando tenemos que organizar información, por ejemplo una lista de precios del menor a mayor.

El resto de las opciones para sort puedo conocerlas haciendo:

man sort

Eliminar duplicados con uniq:

El comando uniq es… único en su tipo. Su manual de instrucciones dice:

NAME
uniq – report or omit repeated lines

manual del comando uniq

Este comando es bastante directo. Se trata de revisar cual es el contenido único o duplicado entre las lineas de un archivo.

Por ejemplo, puedo darle un archivo de texto y cuando me lo devuelve ya eliminó el contenido duplicado.

Por ejemplo, tengo esto dentro de un archivo que recién terminé de crear llamado “dobles”. Puedo verlo con el comando cat:

~$ cat dobles

hola
computadora
naranja
hola
computadora
pomelo
hola

Pero esto es muy importante: El comando uniq solo funciona cuando el texto que voy a revisar esta ordenado. Por eso primero utilizo sort antes de empezar a trabajar.

Voy a crear un nuevo archivo, que voy a llamar “dobles_ordenados”:

~$ sort dobles > dobles_ordenados

Si reviso el contenido del nuevo archivo, voy a encontrarlo organizado:

~$ cat dobles_ordenados

computadora
computadora
hola
hola
hola
naranja
pomelo

Y ahora si, imaginemos que quiero saber que palabras están más de una vez en la lista, y cuantas veces aparecen. Utilizo el comando uniq acompañado de la opción “-c” de esta forma:

~$ uniq -c dobles_ordenados

2 computadora
3 hola
1 naranja
1 pomelo

Para terminar quiero crear una nueva lista, pero ahora sin duplicados. Voy a llamarla “lista_simple”:

~$ uniq dobles_ordenados > lista_simple

Y reviso ahora el resultado:

~$ cat lista_simple

computadora
hola
naranja
pomelo

Y ahí tengo mi nueva lista, ordenada y sin entradas repetidas.

El comando sort puede ser muy útil para automatizar tareas. Solamente tengo que tener creatividad para encontrar la forma de combinar los comandos para crear cosas más complejas.

Conclusión

Este es mi apunte rápido para conocer algunos comandos que procesan texto en la terminal de Linux.

En cuanto aprenda nuevos, voy a actualizar la entrada con más información

La seguimos en el siguiente apunte.

Recursos

Página man del comando cmp (en inglés)

Sitio web del manual para el comando cat (en inglés)

Manual para el comando sort (en inglés)

Página man para el comando uniq (en inglés)

Leave a Reply