Mostrar contenido de ficheros

Cómo ver el contenido de un fichero de texto


A medida que trabajamos con ficheros en una terminal, el nombre del fichero, su ubicación o su extensión puede no ser información suficiente para saber si se trata del fichero que buscamos, y podría interesarnos mostrar el contenido de un fichero rápidamente, para saber si es el que buscamos (o simplemente queremos ver su contenido).

Identificar ficheros

En principio, normalmente identificamos a los ficheros por sus extensiones, si es .txt es un fichero de texto y si es .mp3 se trata de un archivo de audio. Sin embargo, estas extensiones son una convención. Nada nos impide renombrar un fichero .txt como .mp3. Simplemente, no funcionará si lo abro con un reproductor de audio.

Existe un comando no demasiado conocido llamado file con el cuál puedes saber con que tipo de fichero estás trabajando. Sin embargo, file no se guiará por la extensión, sino que analizará su contenido, más concretamente su número mágico, para intentar reconocer que tipo de archivo es.

$ file /etc/hosts
/etc/hosts: ASCII text

$ file music.s3m
/home/manz/music.s3m: ScreamTracker III Module sound data

Nota: Si file no es lo suficientemente exhaustivo para ti, existe un proyecto llamado trID que tiene la misma filosofía que file pero analiza los ficheros en mayor profundidad.

Mostrar contenido

El comando file nos puede servir en algunos casos, pero lo más habitual suele ser examinar rápidamente el contenido de un archivo (aunque sea parcialmente) para saber si es el fichero que nos interesa. Veamos algunos de los comandos que pueden ser interesantes para mostrar el contenido:

Para ello, se suele utilizar el comando cat (conCATenate files), que técnicamente se considera un comando que concatena (une) la salida de uno o varios ficheros. Esto, dicho de otra forma, es que cat no se limita a mostrar el contenido de un solo fichero (como suele usarse habitualmente), sino que puede hacer cosas aún más potentes.

Por ejemplo, el caso más básico sería el siguiente:

$ cat /etc/timezone

Atlantic/Canary

En este ejemplo, mostraríamos el contenido del fichero timezone ubicado en la ruta /etc. Se trata de un fichero que guarda la zona horaria del sistema. De esta forma, podríamos consultarla rápidamente, sin tener que abrirla con un editor. Sin embargo, también podríamos hacer lo siguiente para mostrar el contenido de varios ficheros:

$ ls /etc/deb*
/etc/debconf.conf  /etc/debian_version

$ cat /etc/deb*

Con el comando cat /etc/deb* indicamos que queremos que nos muestre el contenido de todos los fichero que comiencen por deb y estén situados en /etc (en este caso 2 ficheros) y no tendríamos que hacerlo individualmente, uno por uno.

El comando cat tiene algunos parámetros interesantes:

Parám.Descripción
-sSuprime espacios consecutivos repetidos y los convierte en uno solo.
-nNumera las líneas, a la izquierda.
-bNumera solo las líneas no vacías.

Si el comando es muy grande y esta mostrando su contenido y queremos abortar la operación para no esperar a que termine, podemos pulsar CTRL+C, que generalmente se representa como ^C.

Existe una alternativa muy interesante al comando cat, llamada bat y desarrollada en Rust. Dicho comando mejora sustancialmente al comando cat, utilizando características como resaltado de sintaxis en color para lenguajes de programación, soporte para cambios de git, paginación (ver más adelante) automática, etc...

Para instalarla, necesitaremos tener en nuestro sistema Rust instalado, y utilizar su gestor de paquetes cargo. Con él, podremos escribir cargo install bat y lo tendremos disponible. Las últimas versiones de Debian, ya lo incorporan para instalar con un simple sudo apt install bat.

La salida del comando bat de un fichero Javascript sería similar a la siguiente:

bat: alternative to cat (Linux)

El comando bat dispone de varios parámetros interesantes:

ParámetrosDescripción
--list-languagesMuestra los lenguajes soportado en el resaltado de sintaxis.
-l <lang>Especifica el lenguaje a resaltar (C++, javascript, css, rust, ...)
--list-themesMuestra los temas de resaltado de sintaxis disponibles en bat.
--theme <theme>Especifica el tema de resaltado a utilizar.
-pMuestra un formato plano, por si queremos desactivar temporalmente el resaltado.
-nNumera las líneas, pero no utiliza otras decoraciones como los bordes.
-AMuestra los carácteres ocultos (espacios, tabuladores, nueva línea, etc...)
-r <ini>:<fin>Muestra las líneas ini a fin del fichero. Por ejemplo: bat -r 4:10 file.js

Nota: Ejecutando bat --list-themes veremos la lista de temas disponibles para el resaltado de sintaxis. Puedes usar uno de ellos escribiendo bat --theme base16 (por ejemplo). También puedes aprovechar para incluirlo en un alias de la shell y que se ejecute al hacer un cat.

Si el comando cat nos muestra el contenido de un fichero de arriba a abajo, es decir, desde su primera línea a su última línea, el comando tac (cat al revés) hace justo lo contrario, mostrar el contenido de un fichero de abajo a arriba, desde su última línea a la primera.

$ tac textfile.txt

Esta es la última línea.
Esta es la segunda línea.
Esta es la primera línea.

Otra opción posible, aunque menos común, es que si buscamos mostrar el contenido de un archivo al revés, pero en lugar de abajo a arriba, de derecha a izquierda, podemos utilizar el comando rev, que invierte el orden horizontal:

$ cat textfile.txt | rev

.aeníl aremirp al se atsE
.aeníl adnuges al se atsE
.aeníl amitlú al se atsE

El comando catimg nos permite mostrar imágenes en una terminal de texto. Por defecto, si utilizas cat con imágenes, las terminales de texto muestran carácteres extraños o anuncian que se trata de un fichero binario y no muestran su contenido.

Con el comando catimg puedes mostrar la imagen visualmente:

Comando catimg

El comando no suele venir instalado, pero normalmente con un sudo apt install catimg basta para instalarlo, al menos en distribuciones Debian.

Paginar contenido

En algunos casos, nos encontraremos que el contenido de un archivo es demasiado extenso y no nos da tiempo de leer su contenido antes de que siga avanzando en el contenido. La mejor forma de solucionar ese problema es utilizar un paginador.

Se trata de un comando que, una vez detecta que la pantalla está llena, hace una pausa, y no continua hasta que el usuario pulse una tecla. De esta forma, puede ir leyendo poco a poco los contenidos mostrados en pantalla.

El paginador más conocido se llama more y se puede utilizar de dos formas equivalentes: ejecutándolo junto al nombre del fichero, o utilizándolo junto al comando cat (u otro comando que interese) por medio de un pipe |:

$ more largetextfile.txt

$ cat largetextfile.txt | more

En este caso estamos utilizando un pipe | que obtiene la salida por pantalla del primer comando y se lo envía al segundo, que es el paginador. De esta forma, el paginador hace una pausa cuando se llena la pantalla, mostrando una línea more al final de la pantalla y esperando a que el usuario pulse una tecla.

Dependiendo de la tecla que se pulse, el paginador more hará una acción concreta:

TeclaDescripción
ENTERAvanza una sola línea.
SPACEAvanza una página.
=Muestra la línea donde se encuentra el paginador.
/wordBusca la palabra word en el texto y va hasta ella.
nVuelve a buscar la última palabra buscada.
QSale del paginador y vuelve a la terminal.

Muchas veces el paginador more se nos queda corto por varias razones. Por ejemplo, una vez pulsado enter para avanzar, no podemos volver hacia atrás. Existen otros paginadores como less que son un poco más versátiles en este sentido, permitiendo utilizar los cursores y o las teclas RePág o AvPág para subir o bajar en el texto más facilmente.

El comando most es otro paginador que además muestra una barra inferior y resaltado de colores para hacer la lectura un poco más sencilla. Estos paginadores se pueden instalar en el sistema utilizando sudo apt install less o con sudo apt install most.

Nota: Tanto more, como less o como most pueden utilizarse directamente como alternativa de cat. Es decir, ejecutar less largetextfile.txt para mostrar el contenido paginado.

Soporte de compresión

En Linux, es muy habitual trabajar con ficheros de texto plano, aunque en el caso de registros o logs, cuando son muy extensos suelen terminar ocupando mucho espacio. Para evitarlo, se suelen comprimir utilizando formatos muy comunes en Linux como .gz, .bz2 o .xz, de modo que podríamos tener los ficheros de texto originales access.log o los ficheros comprimidos, por ejemplo access.log.gz.

Los comandos cat y less que hemos visto tienen unas versiones alternativas que permiten realizar su finalidad inicial (mostrar contenido o paginar) pero pudiendose hacer sobre archivos de texto comprimidos, sin necesidad de descomprimirlos.

De esta forma, nos ahorramos tener que descomprimir el fichero, visualizar su contenido y volverlo a comprimir, ya que estos comandos lo hacen todo sobre el archivo comprimido, sin alterarlo.

Los comandos son los siguientes:

ComandoCompresorFinalidad
zcatgzipMuestra el contenido de un fichero de texto comprimido .gz.
zlessgzipPagina el contenido de un fichero de texto comprimido .gz.
bzcatbzip2Muestra el contenido de un fichero de texto comprimido .bz2.
bzlessbzip2Pagina el contenido de un fichero de texto comprimido .bz2.
xzcatxzMuestra el contenido de un fichero de texto comprimido .xz.
xzlessxzPagina el contenido de un fichero de texto comprimido .xz.

Si quieres más información sobre formatos de compresión, echa un vistazo al artículo de compresores de Linux.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev