Linux Head: comando de Linux

El comando Linux Head, al igual que el comando Linux Tail, forma parte de las herramientas esenciales de la línea de comandos. Este comando sirve principalmente para mostrar al principio de un archivo (de texto) o para reducir a lo especificado los datos mostrados por un comando de Linux.

El comando de Linux Head forma parte de las “GNU Core Utilities” (Coreutils), una recopilación de los comandos principales de la línea de comandos. Según la filosofía de Unix, los comandos utilizan el texto como formato universal de entrada y salida. Las Coreutils están publicadas bajo una licencia de código abierto y están disponibles para una multitud de sistemas operativos distintos.

Finalidad del comando de Linux Head

El comando Head de Linux se utiliza para reducir la visualización de texto de la línea de comandos. Pero ¿por qué es esto útil o necesario? Para responder a esa pregunta, podemos echar un vistazo a las funciones de la línea de comandos de Linux. La mayoría de los comandos de Linux toman texto como entrada o dan texto como salida. El origen o destino de un comando pueden ser:

  • Archivos: sobre todo archivos de texto en formato ASCII. En este caso, son menos interesantes los archivos binarios, como las imágenes en JPG o los documentos Word.
  • Entrada y salida estándar: texto que le aparece al usuario en el terminal o que este introduce en el terminal.
  • Las llamadas pipes (en español, tuberías): se trata de cadenas de diversos comandos de Linux. La salida de texto de un comando pasa a la entrada de texto del siguiente comando.

Asimismo, debemos tener en cuenta que los archivos pueden tener grandes cantidades de texto. Por ejemplo, un archivo de varios GB contiene miles de millones de caracteres. Por eso, suele ser de gran utilidad limitar la cantidad del texto saliente o ceñirse solo a ciertas líneas o cantidades de texto. Este es un resumen de los comandos de Linux más comunes para mostrar archivos de texto:

  • Linux CAT: muestra el archivo completo. Mostrar grandes archivos inunda la línea de comandos.
  • Linux LESS: muestra el archivo completo por páginas. No es factible en archivos grandes.
  • Linux HEAD: muestra el fragmento inicial del archivo o un fragmento concreto.
  • Linux TAIL: muestra el fragmento final de un archivo o limita la visualización a un fragmento concreto.

Nuestras explicaciones han sido hasta ahora un poco abstractas, así que echa un vistazo a los ejemplos prácticos que mostramos a continuación. Con ellos, podrás hacerte una idea más concreta de lo que representan.

Introducir el comando Linux Head en la línea de comandos

El comando Linux Head se activa en la línea de comandos. Ahí has de introducir el nombre del comando, seguido de otros parámetros opcionales. Para terminar, escribe el nombre o la ruta de uno o varios archivos. Veamos primero cómo se redacta en general:

head [opciones] <archivos>

Sin opciones, la manera más sencilla de activar el comando Linux Head es esta:

head <archivo>

Al activarlo, el comando Head de Linux muestra las primeras líneas del archivo deseado. De esta manera podemos echar rápidamente un vistazo al principio de un archivo y así normalmente nos haremos una idea de qué va el archivo.

En el día a día, el comando Head de Linux puede activarse también con la opción '-n'. El número que introduzcamos después indicará el número de líneas que se mostrarán. Veamos dos ejemplos. El siguiente código nos muestra únicamente la primera línea del archivo.

head -n 1 <archivo>

Con el mismo esquema, también podemos pedir que se muestren las 100 primeras líneas de un archivo:

head -n 100 <archivo>

Opciones del comando de Linux Head

Según la convención, el comando de Linux Head se maneja mediante parámetros opcionales. Como parte de las GNU Coreutils, hay una forma larga para cada opción. Para las opciones más utilizadas también hay una forma corta, muchas veces determinada históricamente. A continuación, se presenta una lista de las opciones más útiles:

Opción (Forma corta / forma larga) Explicación
-n / --lines Limitar la visualización a las primeras n líneas / evitar la visualización de las últimas n líneas
-c / --bytes Limitar la visualización a los primeros n bytes / evitar la visualización de los últimos n bytes
-q / --quiet, --silent Al utilizarlo con múltiples archivos, se evita la visualización de los nombres de archivos
-v / --verbose Al utilizarlo con múltiples archivos, se fuerza la visualización de los nombres de archivos
--help Muestra información de ayuda del comando
Nota

En los siguientes ejemplos, utilizamos las opciones en la forma corta ('-n', en vez de '--lines', etc.). Si lees otros documentos o ejemplos de código, verás con mucha más frecuencia este uso.

Inciso: ¿cómo se entienden las líneas y los caracteres?

Antes de pasar a los ejemplos prácticos, descubre algunos términos. ¿A qué nos referimos cuando hablamos de “líneas” y de “caracteres”? Seguramente podemos responder a estas preguntas intuitivamente, pero en el entorno digital estrictamente reglamentado, debemos saberlo a ciencia cierta.

A nivel interno, un archivo de texto es una cadena de caracteres única y continua. El final de cada línea está marcado simplemente con un carácter llamado “nueva línea”. En función del sistema operativo, el carácter utilizado con este fin puede ser distinto, lo que puede conllevar algún problema. En Linux, es el carácter LF (Line feed) el que marca la nueva línea.

Al utilizar la opción '-c' / '--bytes', se supone que un byte corresponde exactamente a un carácter. Esto funciona para el conjunto de caracteres ASCII, pero en otras situaciones puede dar problemas. El conjunto de caracteres Unicode, ampliamente extendido hoy en día, es una codificación de caracteres “multibyte”. Es decir, para representar un único carácter, hay que utilizar varios bytes. Si aplicamos el comando de Linux Head en archivos de texto Unicode, esto puede tener consecuencias. Así, utilizar la opción '-c' puede hacer que una diéresis (por ejemplo, “ü” se convierta en la vocal correspondiente (“u”).

Ejemplos prácticos para utilizar el comando de Linux Head

Para entender bien los siguientes ejemplos, hemos utilizado el texto de la Declaración Universal de Derechos Humanos (Universal Declaration of Human Rights, UDHR, en inglés). Al haberse traducido a más de 460 idiomas, se trata de uno de los textos más traducidos de la historia de la humanidad. Nos hemos descargado el texto con el comando de Linux Curl y hemos guardado el archivo en el escritorio como 'udhr.txt'.

curl https://www.unicode.org/udhr/d/udhr_eng.txt&gt; ~/Desktop/udhr.txt

Extraer únicamente la primera línea con el comando Head de Linux

Ya has visto el esquema que se utiliza para ver únicamente la primera línea del archivo de texto. Lo utilizamos con un ejemplo concreto:

head -n 1 ~/Desktop/udhr.txt
Consejo

Extraer la primera línea es particularmente interesante para ver el llamado “hash bang” de un archivo de script, que contiene información sobre la ejecución del intérprete utilizado por el script y su ruta.

Extraer todo el texto menos la última línea con el comando Linux Head

De forma similar a lo que sucede con la primera línea, el comando Linux Head también se puede utilizar para extraer el texto hasta la última línea. Para eso, recurrimos a la opción '-n' y anteponemos el signo de menos al argumento:

head -n -1 ~/Desktop/udhr.txt

Combinar los comandos de Linux Head y Tail para extraer determinados extractos del texto

¿Qué pasa si solo queremos extraer el preámbulo de la Declaración Universal de Derechos Humanos en las líneas 9-18? Para conseguirlo, recurriremos al pariente del comando Linux Head. El comando Tail extrae, de manera parecida al comando Head de Linux, el fragmento final de un archivo de texto. Si combinamos ambos comandos con el símbolo del pipe '|’, podemos recortar un fragmento definido del texto.

head -n 18 ~/Desktop/udhr.txt | tail -n 10

También es posible mostrar una única línea en concreto. Para ello, utilizaremos el comando Tail con la opción '-n 1'. Para visualizar únicamente la línea 28 “Everyone has the right to life, liberty and the security of person”, usamos el siguiente comando.

head -n 28 ~/Desktop/udhr.txt | tail -n 1

Como verás, se mostrará la línea completa. Para ver solo hasta “security”, añadimos otro pipe al comando Head. Además, utilizamos la opción '-c' e iremos probando distintos valores como argumento hasta recortar el fragmento adecuado. En este caso, necesitamos solo los primeros 62 caracteres.

head -n 28 ~/Desktop/udhr.txt | tail -n 1 | head -c 62

Podemos tener la intuición de contar el número de caracteres que queremos extraer desde detrás. Esto también es posible al anteponer un símbolo de menos al argumento de la opción '-c'. El comando sigue siendo el mismo:

head -n 28 ~/Desktop/udhr.txt | tail -n 1 | head -c -12

Por último, queremos eliminar los espacios en blanco. Quizá ya lo sabes: para conseguirlo, volvemos a recurrir al comando Tail. Añadimos un signo de más al argumento de la opción x. De la misma manera que con el signo de menos del comando Head de Linux, invertimos el significado de la opción. En vez de limitar la visualización a los últimos cinco caracteres como de costumbre, reduciremos la visualización al resto a partir del quinto carácter principal. Podemos hacer estas operaciones con el comando Sed, aunque en archivos grandes, el comando Head de Linux es más rápido que el Sed.

Filtrar la activación del comando Head de Linux con el comando Grep

Ya has visto cómo puedes combinar los comandos de Linux Head y Tail. Otra combinación útil es filtrar el texto extraído con el comando grep. Así podrías extraer únicamente las líneas que contienen el término de búsqueda. A continuación, queremos ver las líneas que, de las primeras 30 líneas del texto de la UDHR, contengan la palabra “Person”:

head -n 30 ~/Desktop/udhr.txt | grep person

Procesar múltiples archivos con el comando de Linux Head

Hasta ahora hemos aplicado el comando de Linux Head a un único archivo. No obstante, también se puede utilizar con múltiples archivos. Para ello, o bien enumeramos los nombres de los archivos o su ruta explícitamente, o indicamos como origen del comando un directorio completo o un patrón de búsqueda. Mostramos esto último a modo de ejemplo con la ayuda de un archivo de configuración en el directorio del sistema '/etc/'. Los archivos llevan la extensión '.conf', que especificamos como patrón de búsqueda '*.conf':

head -n 1 /etc/*.conf

Para mostrar únicamente los nombres de los archivos al procesar muchos archivos, utilizamos la opción '-q':

head -q -n 1 /etc/*.conf

De manera parecida, podemos utilizar la opción '-v' para extraer solo los nombres de los archivos. Esto es útil cuando solo un archivo contiene el patrón de búsqueda:

head -v /etc/host*.conf

Enumerar los últimos cinco archivos modificados con el comando Linux Head

En Linux, el comando ls sirve para enumerar archivos y directorios. Con la opción '-t', podemos clasificar la lista en orden descendente desde la fecha de la última modificación. Además, para reducir la lista a cinco entradas, activamos el comando Head de Linux como pipe:

ls -t | head -n 5

Extraer un hash aleatorio de una longitud determinada con el comando Head de Linux

El comando de Linux 'sha512sum' crea un hash de una longitud de 128 caracteres. Para comparar dos hashes a simple vista muchas veces no hace falta examinar el hash completo. A veces basta con mirar, por ejemplo, solo los primeros ocho caracteres. Puede que conozcas este patrón por los commits de Git. Para eso, activamos el comando de Linux Head con la opción '-c'. Como fuente de datos, aquí utilizamos la función bash '$RANDOM', que devuelve un número aleatorio:

echo $RANDOM | sha512sum | head -c 8