El comando Linux Cat: significado y uso

El comando Linux Cat es una de las órdenes más usadas de Linux. Se usa sobre todo para emitir el contenido de un archivo en la línea de comandos, aunque hay una gran cantidad de aplicaciones que te mostraremos en este artículo.

¿Qué es Linux-Cat?

A pesar de su nombre, Linux Cat no tiene nada que ver con gatos. En realidad, este comando hace algo más profano: Linux Cat lee el contenido de archivos y lo emite a la línea de comandos. El origen del nombre viene del concepto “concatenar”, aunque esto lo explicaremos más abajo.

Veamos el modelo básico de una reproducción de un Linux Cat. Tal y como puedes observar, escribimos primero “cat”, seguido de las opciones si es necesario, y luego el nombre o las rutas de los archivos que se van a emitir:

cat [Opciones] <Nombre(s) del archivo>

Linux Cat es una parte de “GNU Core Utilities” (Coreutils). Esto se trata de una colección de líneas de comando básicas. Los Coreutils son “Free and Open Source Sofware” (FOSS, en español “software libre y de código abierto”) y están disponibles tan bien como todas las distribuciones de Linux. El comando Linux Cat está además disponible tanto para macOS como para Windows mediante la aplicación “Subsistema de Windows para Linux” (WSL/WSL2).

Consejo

Para determinar si el comando Linux Cat está disponible en tu sistema, haz lo siguiente: abre una línea de comandos y ejecuta ahí el comando 'which cat'. Si Linux Cat se encuentra en tu sistema, se te mostrará la ruta del archivo binario de cat (p.ej. '/bin/cat'). Si aparece una notificación de error, significa que Linux Cat no está disponible en tu sistema.

Opciones de Linux Cat

Como la mayoría de líneas de comando, Linux Cat se controla por parámetros opcionales cuando se reproduce. Estas opciones siguen al nombre del comando. Debes tener en cuenta que hay que distinguir entre mayúsculas y minúsculas. Normalmente hay dos notaciones para la mayoría de las opciones:

1. Forma corta: -, p.ej. 'cmd -h'

La forma corta es menos relevante. Para ello se pueden combinar varias opciones en una, p.ej. 'ls -la' en lugar de 'ls -l -a'. La forma corta es adecuada para trabajos rápidos con órdenes ya conocidas de la lista de comandos.

2. Forma larga: --, p.ej. 'cmd --help'

La forma larga es fácil de entender, necesita más tiempo para escribirla y ocupa más espacio. Es adecuada para la creación de scripts. Los nombres relevantes de las opciones sirven de documentación.

Aquí te mostramos las opciones de Linux Cat más importantes:

Opción Explicación
-h, --help Ayuda a mostrar el comando Linux Cat
-n Enumera las líneas de salida
-s Combina varias líneas en blanco en una sola
-b Enumera todas las líneas de salida excepto las líneas en blanco
-v Emite caracteres invisibles
-e Igual que -v, pero incluyendo el marcador de fin de línea
-t Igual que -v, pero incluyendo el marcador de pestañas
-et Combinación de -e y -t; emite todos los caracteres invisibles

¿Qué significa realmente concatenar?

El nombre de Linux Cat viene de “concatenar”, que a su vez proviene del término en latín “catena” (cadena). Concatenar es un concepto importante en la informática, ya que describe la concatenación, el encadenamiento o la unión de elementos de estructuras de datos contenedores similares. En particular, en la mayoría de los idiomas se pueden combinar varias matrices o cadenas en una sola matriz o cadena. Con ello, los elementos individuales de los contenedores concatenados se combinan en un nuevo contenedor manteniendo el orden.

Un ejemplo simple en pseudocódigo en el pasamos varias cadenas a la función cat y se combinan en una sola cadena:

cat("Pedro ", "y ", "Pablo") -> "Pedro y Pablo"

Linux Cat hace conceptualmente lo mismo: utiliza como elementos las líneas agrupadas dentro de los archivos.

Los distintos lenguajes de programación utilizan diversos símbolos para el operador de concatenación de cadenas. Aquí te mostramos algunos ejemplos de los lenguajes de programación más populares. En todos los casos, el resultado de la concatenación es la cadena “Pedro y Pablo”:

Operador Lenguaje(s) Ejemplo
+ Java, JavaScript, Python Pedro + "y" + " Pablo"
. PHP, Perl Pedro . "y" . " Pablo"
.. Lua Pedro .. "y" .. " Pablo"
~ Twig Pedro ~ "y" ~ " Pablo"
& VisualBasic Pedro & "y" & " Pablo"

En algunos lenguajes, especialmente en Python, se utiliza el mismo operador para concatenar otras estructuras de datos, como las listas:

# Concatenar listas
[1, 2, 3] + [45, 56, 67]
# -> [1, 2, 3, 45, 56, 67]
# SIN constituir:
# [[1, 2, 3], [45, 56, 67]]

# Concatenar registro
(1, 2) + (33, 44)
# -> (1, 2, 33, 44)

El lenguaje estadístico “R” es interesante: no conoce ningún operador de concatenación. En su lugar, usa la opción 'c()'. La “c” ahí significa “concatenar”. Aquí te mostramos una concatenación anidada en varios valores:

c(c(1, 2, 3), c(45, 56, 67))
# -> 1, 2, 3, 45, 56, 67

¿Cómo se utiliza Linux Cat en la práctica?

Los usos reales de Linux Cat son limitados, ya que sigue la filosofía UNIX “do one thing and do it well” (“haz una cosa y hazla bien”). La mayoría de los escenarios de aplicación resultan de la encadenación de la orden con otros comandos. Con ello, se utilizan redireccionamientos de la entrada y salida estándar. En concreto, se trata de las llamadas tuberías y redireccionamientos. Estos son proporcionados por el shell (también llamado “intérprete de comandos”) y su uso se extiende a todos los comandos:

Desviación

Símbolo

Aplicación

Explicación

Pipe

|

cmd1 | cmd2

  Reenvía la salida del comando cmd1 a la entrada del comando cmd2

Input-Redirect

<

cmd < data

Lee los datos de entrada del comando cmd del archivo

Output-Redirect

>

cmd > data

Escribe los datos de salida del comando cmd en el archivo; si es necesario, se sobrescribe el archivo ya existente

Output-Redirect

>>

cmd >> data

Escribe los datos de salida del comando cmd en el archivo; si es necesario, se amplía el archivo ya existente

Linux Cat suele comenzar con una sucesión de otros comandor Linux. Aquí te mostramos los más usados:

Comando Linux

Explicación

split

Divide el archivo en trozos; la operación se puede invertir con cat

uniq

Elimina las líneas de entrada que aparecen más de una vez

sort

Ordena las líneas de entrada de forma alfanumérica

head, tail

Limita la salida a las líneas al principio/final

Veamos ahora los escenarios de aplicación comunes de Linux Cat:

Distribución de archivos en la línea de comandos con Linux Cat

El uso más común de Linux Cat es el de mostrar todo el contenido de un archivo en la línea de comandos. Esto es útil para echar un vistazo rápido a un archivo. A diferencia de lo que ocurre al abrir el archivo en un editor, no tienes que preocuparte por cambiar el archivo accidentalmente. Aquí tienes un ejemplo de salida de un archivo en la línea de comandos:

cat ./path/to/file.txt

Veamos un par de escenarios comunes. Imagina que has iniciado sesión a través de SSH en un servidor que funciona mediante WordPress. Te encuentras en el directorio raíz de WordPress y quieres mostrar el contenido del archivo de configuración'wp-config.php'. Entonces tendrás que utilizar el siguiente comando de Linux Cat:

cat wp-config.php

A menudo es suficiente con la salida de un archivo en la línea de comandos. En algunos casos, sin embargo, queremos copiar el contenido del archivo en el portapapeles. La salida visible en la línea de comandos puede suponer un riesgo con los datos sensibles. En ambos casos, es una buena idea reenviar la salida de Linux Cat a un programa que escriba los datos en el portapapeles. En macOS, la herramienta de línea de comandos 'pbcopy' está disponible para esta finalidad; en Windows con WSL/2 y las diversas distribuciones de Linux, están disponibles herramientas equivalentes como 'clip' o 'xclip'.

Veamos el siguiente ejemplo: queremos copiar nuestra clave pública SSH para la configuración de un repositorio de software GitHub. Suponiendo que la clave con el nombre 'id_rsa.pub' se encuentra en el directorio '.ssh/' en nuestro directorio de usuario, podemos hacer el truco en macOS con el siguiente comando de Linux Cat:

cat ~/.ssh/id_rsa.pub > pbcopy

Tal y como indica el nombre de Linux Cat, éste deja que se combinen varios archivos y que se emitan en uno solo. Imaginemos que tenemos una lista con frutas, verduras y productos lácteos en tres archivos guardados bajo el nombre 'food/'. De la siguiente manera podremos combinar las tres listas en una sola y escribirlas en un archivo llamado 'food.txt':

cat ./food/fruit.txt ./food/veggies.txt ./food/dairy.txt > food.txt

Como es habitual en la línea de comandos, podemos usar el marcador de posición'*' para elegir todos los archivos de un directorio:

cat ./food/*.txt > food.txt

Escribir un texto en un archivo con Linux Cat

Con el uso de las desviaciones de salidas que se han mencionado anteriormente, puedes escribir un texto en un archivo con Linux Cat. Esto se puede hacer de tres formas:

  1. Crear un archivo nuevo en el que vas a escribir el texto introducido.
  2. Sobrescribir un archivo que ya existe con el texto introducido.
  3. Adjuntar el texto introducido en un archivo ya existente.

Veamos los tres escenarios. En primer lugar, vamos a escribir un texto de la línea de comandos en un archivo que no existe:

  1. Emitir Linux Cat y reenviar la salida a un archivo que no existe. El comando cogerá los datos de la entrada estándar hasta que se lea el carácter de fin de archivo (“End-of-file”, EOF):

 

cat > new.txt
  1. Meter el texto que deseas en la línea de comandos.
  2. Finalizar la entrada pulsando la combinación de teclas [Ctrl] + [D]. Esta combinación de teclas corresponde al carácter de fin de archivo.

El texto introducido se encuentra en el archivo 'new.txt'. Esto se puede comprobar a través del comando 'cat new.txt'.

Para adjuntar un texto introducido en un archivo ya existente usamos el mismo método:

  1. Emitir Linux Cat y reenviar la salida a un archivo que existe:
cat >> existing.txt
  1. Meter el texto que deseas en la línea de comandos.
  2. Finalizar la entrada pulsando la combinación de teclas [Ctrl] + [D].

Si usamos el símbolo '>' en lugar del reenvío de salida '>>', se sobrescribe el archivo existente con el texto introducido. Ten cuidado con esto: el contenido anterior del archivo se pierde de manera irrevocable.

Preparar datos para otros trabajos con Linux Cat

Un uso común de Linux Cat es combinar datos de varios archivos. A menudo, los datos combinados se pasan por filtros para prepararlos para su posterior procesamiento. Este patrón siempre se encuentra cuando hay datos similares repartidos en varios archivos. Cada uno de los archivos contiene una entrada por línea. Piensa, por ejemplo, en listas de nombres, direcciones IP o similares.

Para tener una visión general de todas las características de los datos, se plantea la siguiente tarea: queremos combinar todas las entradas y eliminar las que estén duplicadas. Por último, deben clasificarse las entradas y escribirse en un archivo nuevo. Como ejemplo concreto, imaginemos que tenemos un conjunto de archivos de texto. Cada archivo contiene los nombres de los actores de un determinado episodio de la serie de cómics “Los Simpsons”. Si combinamos las entradas de todos los archivos como se ha descrito, obtenemos una lista de todos los actores de Los Simpsons.

Los archivos descritos en nuestro ejemplo con los actores de Los Simpsons de los episodios individuales se verían de una manera esquemática parecida a esta:

simpsons-1.txt simpsons-2.txt simpsons-3.txt
Lisa Bart Bart
Marge Lisa Maggie
Homer Homer Nelson
Flanders Milhouse  

Imaginemos que los archivos de texto individuales se encuentran en el directorio 'simpsons/'. Entonces solo será suficiente el uso de Linux Cat, concatenado con los comandos 'uniq' y 'sort', para escribir la lista con todos los actores de Los Simpsons en el archivo 'simpsons.txt'.

cat ./simpsons/*.txt | uniq | sort > simpsons.txt

Numerar líneas de un archivo de texto con Linux Cat

Un uso común de Linux Cat es el de numerar las líneas en un archivo de texto. Imaginemos que tenemos un archivo de texto con una entrada por línea, pero queremos escribir delante de cada línea el número de esta. Esto es útil, por ejemplo, cuando damos el archivo resultante a otra parte para que lo revise. De este modo, ambas partes pueden referirse a líneas específicas en la correspondencia.

Con Linux Cat es muy fácil numerarlas. Usamos la opción '-n' y una redirección de la salida:

cat -n doc.txt > doc.numbered.txt

En el escenario descrito tiene sentido numerar todas las líneas, excepto las vacías. Además, combinamos varias líneas en blanco en una sola. Para ello, utilizamos la combinación de las opciones '-s' y '-b':

cat -sb doc.txt > doc.numbered.txt

Combinar archivos de plantilla con Linux Cat

Un patrón conocido de la programación web consiste en ensamblar documentos a partir de piezas de conjunto. La combinación de las llamadas partes de la plantilla con las partes únicas da lugar a diversos documentos con una estructura coherente. Para esto normalmente se utiliza PHP con la orden 'include' o un lenguaje especial de plantillas como Twig, pero el mismo principio se puede implementar con Linux Cat.

Supongamos que tenemos varias partes de plantillas en el directorio 'parts/'. La cabecera y el pie de página tienen que ser idénticos en todos los documentos creados. La estructura y el contenido de la cabecera y del pie de página se definen en los archivos 'header.html' y 'footer.html'. Además, hay varios archivos con el contenido real de los documentos en el directorio 'main/'. Los documentos terminados se almacenan en el directorio de salida 'www/'. Para crear un documento solamente tienes que hacer uso de Linux Cat:

cat ./parts/header.html ./main/home.html ./parts/footer.html > ./www/index.html

Otro escenario: hay que proporcionar un texto de licencia a una base de códigos para poder publicarlo. La licencia debe insertarse al principio de cada archivo de código. Imaginemos la composición de directorios siguiente:

  • Archivos de código fuente de Python con extensión '.py' en el directorio 'src/'
  • Un archivo de licencia 'license.py' en el directorio 'inc/'
  • Un directorio 'dist/' vacío al principio para almacenar los archivos procesados

Usamos Linux Cat dentro de un bucle for. En cada ejecución del bucle, el mismo archivo de licencia se concatena con uno de los archivos de código fuente. El resultado se escribe en un nuevo archivo de código fuente con el mismo nombre:

for file in ./src/*.py ; do
  cat ./inc/license.py "$file" > "./dist/${file}"
done

Fusionar archivos divididos con Linux Cat

Linux Cat se usa mayoritariamente para el procesamiento de archivos de texto planos, aunque el comando también funciona con archivos binarios. Esto es útil es algunos escenarios. Por un lado, los comandos de Linux 'split' o 'csplit' pueden utilizarse para volver a montar archivos que han sido divididos en varias partes. Aquí te mostramos el enfoque general:

# Nombre del archivo que hay que descomponer
file_name="./path/to/file"
# Especificamos de manera explícita la extensión del archivo para añadirla después de la fusión
extension="txt"
# Dividimos el archivo original en trozos de 10 kilobytes con el prefijo 'part_'
split -b 10k "${file_name}.${extension}" part_
# Fusionamos las piezas individuales en el archivo nuevo
cat part_* > combined
# Restauramos la extensión original del archivo
mv combined "combined.${extension}"

Por otro lado, Linux Cat se ofrece a combinar descargas parciales. Muchas herramientas pueden interrumpir las descargas y reanudarlas más tarde. Esto es especialmente útil cuando se descarga un archivo grande a través de una conexión de red débil. Prueba el ejemplo en tu propio sistema:

# Creamos una carpeta de prueba en el escritorio
mkdir ~/Desktop/cat-test/
# Lo cambiamos a la carpeta de prueba
cd ~/Desktop/cat-test/
# Imagen de un gato de dominio público de WikiMedia
image=https://upload.wikimedia.org/wikipedia/commons/f/fa/Cat_using_computer.jpg
# Descargamos la imagen en dos partes con 'curl'
curl -s -r 0-500000 "$image" -o first-half &
curl -s -r 500001- "$image" -o second-half &
wait
# Combinar las partes y escribir en el archivo JPGE
cat first-half second-half > image.jpg

Combinar flujos de datos con Linux Cat

Linux Cat se puede usar para combinar flujos de datos en el procesamiento de vídeo. Aquí te mostramos el patrón general. En primer lugar, creamos varios flujos de vídeo cortos a partir de una imagen JPEG con el comando ffmpeg y luego los combinamos en un vídeo continuo:

# Creamos un bucle a partir de la imagen
ffmpeg -y -loop 1 -i image.jpg -t 3 \
    -c:v libx264 -vf scale=w=800:h=-1 \
    still.ts
# Creamos un fundido claro en la imagen
ffmpeg -y -loop 1 -i image.jpg -t 3 \
    -c:v libx264 -vf scale=w=800:h=-1,fade=in:0:75 \
    fadein.ts
# Creamos un fundido oscuro en la imagen
ffmpeg -y -loop 1 -i image.jpg -t 3 \
    -c:v libx264 -vf scale=w=800:h=-1,fade=out:0:75 \
    fadeout.ts
# Combinamos ambos fundidos y el bucle
cat fadein.ts still.ts fadeout.ts > video.ts

¿Cuándo no hay que utilizar Linux Cat?

El uso innecesario de Linux Cat es un conocido “antipatrón”. Esto se describe en numerosos artículos; incluso hay un “Useless Use of Cat Award”. Como regla de oro, se debe utilizar Linux Cat cuando se combinan varios archivos. Si quieres procesar un solo archivo, puedes hacerlo sin un cat.

Echemos un vistazo al enfoque general con cuya ayuda podemos minimizar el uso innecesario de Linux Cat. El siguiente ejemplo se puede encontrar a menudo en mensajes de foros y artículos de blogs:

cat example.txt | less

Linux Cat se utiliza para leer un solo archivo. La salida se pasa a través de la redirección de tuberías al comando less para mostrar el contenido del archivo página por página. Sin embargo, esto también puede hacerse de forma más sencilla:

less < example.txt

Usamos el commando less y la redirección de entrada del shell para leer el archivo. E incluso este planteamiento puede simplificarse aún más:

less example.txt

En lugar de usar una redirección de entrada, transferimos a procesar el archivo al comando less. Esto se debe a que casi todoslos comandos de Linux reciben los nombres de los archivos como parámetros.

¿Qué alternativas a Linux Cat existen?

Como hemos descrito anteriormente, Linux Cat se utiliza a menudo de forma innecesaria. Para algunos de los escenarios de uso más comunes existen alternativas. Aquí te mostramos tres ejemplos:

Comando Uso alternativo Ejemplo
less / more Emitir el contenido del archivo página por página en la línea de comandos less file.txt, more file.txt
touch Crear un archivo nuevo y vacío touch new.txt
echo Escribir un texto en el archivo echo "Text" > file.txt

¿Qué otros comandos se parecen a Linux Cat?

Hay una serie de comandos de Linux que son similares al comando cat. De hecho, los nombres de estos comandos a menudo se basan en “cat”. En primer lugar, está el comando tac, cuyo nombre es simplemente cat invertido. Y así es como funciona el comando tac: como el comando cat de Linux, sólo que con la salida invertida. Así, cuando se llama al comando tac con un solo archivo, se emite primero la última línea, en lugar de la primera como con cat.

Otro comando con un nombre similar a Linux Cat es el comando nc, abreviado como “Netcat”. Este comando se suele denominar como la "navaja suiza de TCP/IP". En lugar de operar en archivos locales como cat, Netcat lee y escribe datos a través de conexiones de red. Si quieres saber más sobre esto, puedes leer nuestro artículo sobre el tema.

Una alternativa más reciente a Linux Cat es el comandobat. En la página de GitHub del comando, se llama “un clon de cat con alas” (en inglés, “A cat clone with wings”). El comando bat conserva la funcionalidad básica de Linux Cat, pero proporciona algunas funciones de comodidad. En particular, provee de la salida de los archivos de código fuente a través del comando bat con resaltado de sintaxis.