Cómo utilizar los comandos cat y tac de Linux

Arte de una ventana de terminal en un escritorio Linux
Fatmawati Achmad Zaenuri / Shutterstock.com

Los  comandos caty tacmuestran el contenido de los archivos de texto, pero hay más en ellos de lo que parece. Sumérjase un poco más y aprenda algunos trucos productivos de la línea de comandos de Linux.

Estos son dos pequeños comandos sencillos, que a menudo se descartan por ser solo eso: demasiado simples para ser de utilidad real. Pero una vez que conozca las diferentes formas en que puede usarlos, verá que son perfectamente capaces de hacer su parte justa del trabajo pesado cuando se trata de trabajar con archivos.

El comando del gato

catse utiliza para examinar el contenido de archivos de texto y para unir partes de archivos para formar un archivo más grande.

En un momento, en la era del  módem de acceso telefónico, los archivos binarios solían dividirse en varios archivos más pequeños para facilitar la descarga. En lugar de descargar un archivo grande, retiró cada archivo más pequeño. Si un solo archivo no se descargó correctamente, simplemente recuperaría ese archivo nuevamente.

Por supuesto, entonces necesitaba una forma de reconstituir la colección de archivos más pequeños en un solo archivo binario de trabajo. Ese proceso se llamó concatenación. Y ahí es donde catentró y de donde toma su nombre.

Las conexiones de banda ancha y fibra han provocado que esa necesidad en particular se desvanezca, al igual que los sonidos chirriantes de las llamadas telefónicas, así que, ¿qué queda por cathacer hoy? Mucho en realidad.

Visualización de un archivo de texto

Para tener una catlista del contenido de un archivo de texto en una ventana de terminal, use el siguiente comando.

Asegúrese de que el archivo sea un archivo de texto. Si intenta listar el contenido de un archivo binario en la ventana del terminal, los resultados serán impredecibles. Puede terminar con una sesión de terminal bloqueada o algo peor.

gato poema1.txt

cat poem1.txt en una ventana de terminal

El contenido del archivo poem1.txt se muestra en la ventana de terminal.

el contenido de poem1.txt en una ventana de terminal

Eso es solo la mitad del famoso poema. ¿Dónde está el resto? Aquí hay otro archivo llamado poem2.txt. Podemos hacer una catlista del contenido de varios archivos con un comando. Todo lo que tenemos que hacer es listar los archivos en orden en la línea de comando.

gato poem1.txt poem2.txt

cat poem1.txt poem2.txt en una ventana de terminal

Eso se ve mejor; ahora tenemos el poema completo.

contenido de poem1.txt y poem2.txt en una ventana de terminal

Usar gato con menos

El poema está todo allí, pero pasó por la ventana demasiado rápido para leer los primeros versos. Podemos canalizar la salida desde catdentro lessy desplazarse hacia abajo a través del texto a nuestro propio ritmo.

cat poem1.txt poem2.txt | Menos

cat poem1.txt poem2.txt |  menos en una ventana de terminal

Ahora podemos avanzar y retroceder por el texto en una secuencia, aunque se encuentre en dos archivos de texto separados.

Relacionado:  Cómo instalar y usar TeamViewer en Linux

contenido de poem1.txt y poem2.txt en menos en una ventana de terminal

Numerar las líneas en un archivo

Podemos hacer que cat numere las líneas en el archivo a medida que se muestra. Para hacer esto, usamos la -nopción (número).

gato -n poema1.txt

cat -n poem1.txt en una ventana de terminal

Las líneas están numeradas a medida que se muestran en la ventana del terminal.

contenido de poem1.txt con líneas numeradas en una ventana de terminal

No numere las líneas en blanco

Logramos tener las líneas numeradas por cat, pero las líneas en blanco entre los versos también se están contando. Para tener las líneas de texto numeradas pero para ignorar las líneas en blanco, use la -bopción (número-no en blanco).

cat -b poema1.txt

cat -b poem1.txt en una ventana de terminal

Ahora las líneas de texto están numeradas y las líneas en blanco se omiten.

líneas numeradas saltando en blanco l; ines en una ventana de terminal

No muestre varias líneas en blanco

Si hay secciones de líneas en blanco consecutivas en un archivo, podemos solicitar catignorar todas las líneas en blanco menos una. Mira este archivo.

contenido de un archivo con líneas consecutivas en blanco en una ventana de terminal

El siguiente comando hará catque se muestre solo una línea en blanco de cada grupo de líneas en blanco. La opción que necesitamos para lograr esto es la -sopción (squeeze-blank).

gato -s poema1.txt

cat -b poem1.txt en una ventana de terminal

Esto no afecta el contenido del archivo de ninguna manera; simplemente cambia la forma en que catmuestra el archivo.

Se ignoran varias líneas en blanco en una ventana de terminal

Pestañas de visualización

Si desea saber si los espacios en blanco son causados ​​por espacios o tabulaciones, puede averiguarlo usando la -Topción (mostrar tabulaciones).

gato -T poem1.txt

cat -T poem1.txt en una viuda terminal

Las pestañas están representadas por los caracteres “^ I”.

contenido de poema1.txt con pestañas que se muestran en una ventana de terminal

Visualización de los extremos de las líneas

Puede verificar si hay espacios en blanco finales usando la -E opción (show-ends).

gato -E poem1.txt

cat -T poem1.txt en una ventana de terminal

Los finales de las líneas están representados por el carácter «$».

contenido de poem1.txt con extremos de línea mostrados en una ventana de terminal

Concatenar archivos

No tiene sentido tener un poema guardado en dos archivos, con la mitad en cada uno. Unámoslos y creemos un nuevo archivo con el poema completo.

gato poem1.txt poem2.txt> jabberwocky.txt

cat poem1.txt poem2.txt> jabberwocky.txt en una ventana de terminal

usemos catpara verificar nuestro nuevo archivo:

gato jabberwocky.txt

cat jabberwocky.txt en una ventana de terminal

Nuestro nuevo archivo contiene el contenido de los otros dos archivos.

contenido de jabberwocky.tx en una ventana de terminal

Agregar texto a un archivo existente

Eso es mejor, pero en realidad, no es el poema completo. Falta el último verso. El último verso de Jabberwocky es el mismo que el primer verso.

Si tenemos el primer verso en un archivo, podemos agregarlo al final del archivo jabberwocky.txt y tendremos el poema completo.

En este siguiente comando, tenemos que usar >>, no solo >. Si usamos uno solo >, sobrescribiremos jabberwocky.txt. No queremos hacer eso. Queremos agregar texto al final.

gato first_verse.txt >> jabberwocky.txt

cat first_verse.txt >> jabberwocky.txt en una ventana de terminal

Revisemos el contenido del archivo jabberwocky.txt:

gato jabberwocky.txt

cat jabberwocky.txt en una ventana de terminal

Y finalmente, todas las partes del poema están juntas.

contenido de jabberwocky.txt en una ventana de terminal

Redirigir stdin

Puede redirigir la entrada desde el teclado a un archivo usando cat. Todo lo que escribe se redirige al archivo hasta que presione Ctrl + D. Tenga en cuenta que usamos uno solo >porque queremos crear el archivo (o sobrescribirlo, si existe).

gato> my_poem.txt

cat> my_poem.txt en una ventana de terminal

Podemos empezar a escribir tan pronto como emitamos el comando. Presionamos Ctrl + D cuando hemos terminado. Luego podemos verificar el contenido del nuevo archivo con:

gato mi-poema.txt

Doggerel de bajo grado en una ventana de terminal

Ese sonido como una turbina lejana probablemente sea Lewis Carroll girando en su tumba a gran velocidad.

Relacionado:  Cómo analizar archivos JSON en la línea de comandos de Linux con jq

El comando tac

taces similar a cat, pero enumera el contenido de los archivos en orden inverso .

Veamos eso:

tac my_poem.txt

tac my_poem.txt en una ventana de terminal

Y el archivo aparece en la ventana de terminal en orden inverso. En este caso, no tiene ningún efecto sobre sus méritos literarios.

my_poem.txt enumerado en orden inverso en una ventana de terminal

Usando tac con stdin

El uso tacsin un nombre de archivo hará que opere en la entrada del teclado. Al presionar Ctrl + D se detendrá la fase de entrada, y tac enumerará en orden inverso lo que haya escrito.

tac

tac trabajando con stdin en una ventana de terminal

Cuando se presiona Ctrl + D, la entrada se invierte y aparece en la ventana de terminal.

salida de tac usando stdin en una ventana de terminal

Uso de tac con archivos de registro

Aparte de los trucos de salón de baja calidad, ¿se puede tachacer algo útil? Sí puede. Muchos archivos de registro añaden sus entradas más recientes al final del archivo. Usando tac(y, en contra de la intuición,  head) podemos hacer aparecer la última entrada en la ventana de terminal.

Usamos tacpara listar el archivo syslog al revés y lo canalizamos en head. Al decirle headque imprima solo la primera línea que recibe (que gracias a taces la última línea en el archivo), vemos la última entrada en el archivo syslog.

tac / var / log / syslog | cabeza -1

tac / var / log / syslog |  head -1 en una ventana de terminal

head imprime la última entrada del archivo syslog y luego sale.

Tenga en cuenta que headsolo se imprime una línea, como solicitamos, pero la línea es tan larga que se envuelve dos veces. Es por eso que parece tres líneas de salida en la ventana de terminal.

última entrada de syslog en una ventana de terminal

Usar tac con registros de texto

El último truco que  tac tiene bajo la manga es una belleza.

Por lo general, tacopera en archivos de texto trabajando a través de ellos línea por línea, de abajo hacia arriba. Una línea es una secuencia de caracteres terminada por un carácter de nueva línea. Pero podemos decirle tacque trabajemos con otros delimitadores. Esto nos permite tratar “fragmentos” de datos dentro del archivo de texto como registros de datos.

Digamos que tenemos un archivo de registro de algún programa que necesitamos revisar o analizar. Echemos un vistazo a su formato con less.

menos logfile.dat

menos archivo de registro en una ventana de terminal

Como podemos ver, existe un formato repetido para el archivo. Hay secuencias de tres líneas de valores hexadecimales . Cada conjunto de tres líneas hexadecimales tiene una línea de etiqueta que comienza con “= SEQ”, seguida de una secuencia de dígitos.

parte superior del archivo de registro en una ventana de terminal

Si nos desplazamos hasta el final del archivo, podemos ver que hay muchos de estos registros. El último tiene el número 865.

parte inferior del archivo de registro en una ventana de terminal

Supongamos que, por cualquier motivo, necesitamos trabajar con este archivo en orden inverso, registro de datos por registro. Debe conservarse el orden de las tres líneas hexadecimales de cada registro de datos.

Relacionado:  Cómo usar el comando uniq en Linux

Tomaremos nota de que las últimas tres líneas del archivo comienzan con los valores hexadecimales 93, E7 y B8, en ese orden.

Usemos tac para revertir el archivo. Es un archivo muy largo, así que lo integraremos less.

tac logfile.dat | Menos

tac logfile.dat |  menos en una ventana de terminal

Eso invierte el archivo, pero no es el resultado que queremos. Queremos que el archivo se invierta, pero las líneas de cada registro de datos deben estar en su orden original.

archivo de registro invertido en menos en una ventana de terminal

Registramos anteriormente que las últimas tres líneas en el archivo comienzan con valores hexadecimales 93, E7 y B8, en ese orden. El orden de esas líneas se ha invertido. Además, las líneas «= SEQ» están ahora debajo de cada conjunto de tres líneas hexadecimales.

tac al rescate.

tac -b -r -s ^ = SEC. + [0-9] + * $ logfile.dat | Menos

tac -b -r -s ^ = SEC. + [0-9] + * $ logfile.dat |  menos en una ventana de terminal

Analicemos eso.

La -sopción (separador) informa  tacqué queremos usar como delimitador entre nuestros registros. Dice que tac no use su carácter de nueva línea habitual, sino que use nuestro separador en su lugar.

La -ropción (regex) indica tac que se trate la cadena de separación como una expresión regular .

La -bopción (antes) hace tacque aparezca el separador antes de cada registro en lugar de después de él (que es la posición habitual de su separador predeterminado, el carácter de nueva línea).

La -scadena (separador) ^=SEQ.+[0-9]+*$se descifra de la siguiente manera:

El ^carácter representa el comienzo de la línea. A esto le sigue =SEQ.+[0-9]+*$. Esto indica  tacque busque cada aparición de «= SEQ». al comienzo de una línea, seguido de cualquier secuencia de dígitos (indicado por [0-9]), y seguido de cualquier otro conjunto de caracteres (indicado por *$).

Estamos canalizando todo less, como de costumbre.

archivo de registro invertido con registros de datos formados correctamente

Nuestro archivo ahora se presenta en orden inverso con cada línea de etiqueta «= SEQ» listada antes de sus tres líneas de datos hexadecimales. Las tres líneas de valores hexadecimales están en su orden original dentro de cada registro de datos.

Podemos comprobar esto simplemente. El primer valor de las primeras tres líneas de hexadecimal (que eran las últimas tres líneas antes de que se invirtiera el archivo) coincide con los valores de los que tomamos un registro anterior: 93, E7 y B8, en ese orden.

Eso es todo un truco para una ventana de terminal de una sola línea.

Todo tiene un propósito

En el mundo de Linux, incluso los comandos y utilidades aparentemente más simples pueden tener propiedades sorprendentes y poderosas.

La filosofía de diseño de utilidades simples que hacen bien una cosa y que interactúan fácilmente con otras utilidades ha dado lugar a algunos pequeños comandos extraños, como tac. A primera vista, parece un poco extraño. Pero cuando miras debajo de la superficie, hay un poder inesperado que puedes aprovechar para tu ventaja.

O, como dice otra filosofía, «No desprecies a la serpiente por no tener cuernos, porque ¿quién puede decir que no se convertirá en dragón?»