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 |
---|---|
-s | Suprime espacios consecutivos repetidos y los convierte en uno solo. |
-n | Numera las líneas, a la izquierda. |
-b | Numera 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:
El comando bat
dispone de varios parámetros interesantes:
Parámetros | Descripción |
---|---|
--list-languages | Muestra los lenguajes soportado en el resaltado de sintaxis. |
-l <lang> | Especifica el lenguaje a resaltar (C++, javascript, css, rust, ...) |
--list-themes | Muestra los temas de resaltado de sintaxis disponibles en bat . |
--theme <theme> | Especifica el tema de resaltado a utilizar. |
-p | Muestra un formato plano, por si queremos desactivar temporalmente el resaltado. |
-n | Numera las líneas, pero no utiliza otras decoraciones como los bordes. |
-A | Muestra 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 escribiendobat --theme base16
(por ejemplo). También puedes aprovechar para incluirlo en un alias de la shell y que se ejecute al hacer uncat
.
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:
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:
Tecla | Descripción |
---|---|
ENTER | Avanza una sola línea. |
SPACE | Avanza una página. |
= | Muestra la línea donde se encuentra el paginador. |
/word | Busca la palabra word en el texto y va hasta ella. |
n | Vuelve a buscar la última palabra buscada. |
Q | Sale 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
, comoless
o comomost
pueden utilizarse directamente como alternativa decat
. Es decir, ejecutarless 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:
Comando | Compresor | Finalidad |
---|---|---|
zcat | gzip | Muestra el contenido de un fichero de texto comprimido .gz . |
zless | gzip | Pagina el contenido de un fichero de texto comprimido .gz . |
bzcat | bzip2 | Muestra el contenido de un fichero de texto comprimido .bz2 . |
bzless | bzip2 | Pagina el contenido de un fichero de texto comprimido .bz2 . |
xzcat | xz | Muestra el contenido de un fichero de texto comprimido .xz . |
xzless | xz | Pagina 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.