Comando head de Linux: Visualización del Inicio de Archivos

LinuxBeginner
Practicar Ahora

Introducción

En esta práctica de laboratorio, exploraremos el comando head en Linux, una herramienta muy útil para previsualizar el comienzo de los archivos de texto. Imagina que eres un detective digital encargado de escanear rápidamente numerosos archivos para encontrar información crucial. El comando head será tu lupa de confianza, permitiéndote echar un vistazo al inicio de los archivos sin tener que abrirlos por completo.

Simularemos un escenario en el que estás investigando una colección de archivos de registro (logs) de un servidor web con mucho tráfico. Tu objetivo es examinar estos registros de manera eficiente para identificar posibles problemas y obtener información relevante. A través de este ejercicio práctico, aprenderás a utilizar el comando head de forma eficaz, logrando que tus tareas de exploración de archivos sean más rápidas y productivas.

Conceptos Básicos de head

Comencemos examinando un archivo de registro sencillo para entender cómo funciona head.

Primero, dirígete al directorio del proyecto:

cd /home/labex/project

Ahora, utilicemos el comando head en un archivo llamado access.log:

head access.log

Deberías ver una salida similar a esta:

192.168.1.100 - - [01/Jan/2024:00:00:01 +0000] "GET /index.html HTTP/1.1" 200 1234
192.168.1.101 - - [01/Jan/2024:00:00:02 +0000] "GET /style.css HTTP/1.1" 200 567
192.168.1.102 - - [01/Jan/2024:00:00:03 +0000] "GET /logo.png HTTP/1.1" 200 2345
192.168.1.103 - - [01/Jan/2024:00:00:04 +0000] "POST /login HTTP/1.1" 302 -
192.168.1.104 - - [01/Jan/2024:00:00:05 +0000] "GET /dashboard HTTP/1.1" 200 3456
192.168.1.105 - - [01/Jan/2024:00:00:06 +0000] "GET /api/user HTTP/1.1" 200 789
192.168.1.106 - - [01/Jan/2024:00:00:07 +0000] "GET /images/banner.jpg HTTP/1.1" 200 4567
192.168.1.107 - - [01/Jan/2024:00:00:08 +0000] "POST /comment HTTP/1.1" 201 -
192.168.1.108 - - [01/Jan/2024:00:00:09 +0000] "GET /search?q=linux HTTP/1.1" 200 2345
192.168.1.109 - - [01/Jan/2024:00:00:10 +0000] "GET /about HTTP/1.1" 200 1234

Por defecto, head muestra las primeras 10 líneas del archivo. Cada línea en este registro representa una única solicitud al servidor web, mostrando la dirección IP, la marca de tiempo, el método HTTP, el recurso solicitado, el código de estado y el tamaño de la respuesta.

Personalización del Número de Líneas

A veces, 10 líneas pueden ser demasiadas o muy pocas. Aprendamos cómo personalizar la cantidad de líneas que muestra head.

Para ver solo las primeras 5 líneas del registro, utiliza la opción -n:

head -n 5 access.log

Este comando debería devolver:

192.168.1.100 - - [01/Jan/2024:00:00:01 +0000] "GET /index.html HTTP/1.1" 200 1234
192.168.1.101 - - [01/Jan/2024:00:00:02 +0000] "GET /style.css HTTP/1.1" 200 567
192.168.1.102 - - [01/Jan/2024:00:00:03 +0000] "GET /logo.png HTTP/1.1" 200 2345
192.168.1.103 - - [01/Jan/2024:00:00:04 +0000] "POST /login HTTP/1.1" 302 -
192.168.1.104 - - [01/Jan/2024:00:00:05 +0000] "GET /dashboard HTTP/1.1" 200 3456

Esto resulta especialmente útil cuando buscas información específica cerca del inicio de un archivo pero no necesitas ver las 10 líneas completas.

Examen de Múltiples Archivos

Como detective de archivos, a menudo necesitarás revisar varios documentos rápidamente. El comando head te permite visualizar el inicio de múltiples archivos de forma simultánea.

Examinemos el comienzo de los archivos access.log y error.log:

head access.log error.log

Deberías ver una salida similar a esta:

==> access.log <==
192.168.1.120 - - [01/Jan/2024:00:00:53 +0000] "POST /about HTTP/1.1" 200 7616
192.168.1.147 - - [01/Jan/2024:00:00:45 +0000] "GET /dashboard HTTP/1.1" 200 7348
192.168.1.138 - - [01/Jan/2024:00:00:03 +0000] "DELETE /comment HTTP/1.1" 400 8341
192.168.1.138 - - [01/Jan/2024:00:00:31 +0000] "DELETE /about HTTP/1.1" 200 3254
192.168.1.122 - - [01/Jan/2024:00:00:15 +0000] "PUT /index.html HTTP/1.1" 500 6061
192.168.1.125 - - [01/Jan/2024:00:00:09 +0000] "DELETE /logo.png HTTP/1.1" 301 4916
192.168.1.148 - - [01/Jan/2024:00:00:33 +0000] "POST /admin/dashboard HTTP/1.1" 201 5546
192.168.1.146 - - [01/Jan/2024:00:00:56 +0000] "GET /images/banner.jpg HTTP/1.1" 301 2332
192.168.1.195 - - [01/Jan/2024:00:00:12 +0000] "DELETE /dashboard HTTP/1.1" 404 6740
192.168.1.136 - - [01/Jan/2024:00:00:18 +0000] "GET /login HTTP/1.1" 200 2374

==> error.log <==
[01/Jan/2024:00:01:23 +0000] [error] [client 192.168.1.150] File does not exist: /var/www/html/missing.html
[01/Jan/2024:00:02:34 +0000] [error] [client 192.168.1.151] PHP Parse error:  syntax error, unexpected ';' in /var/www/html/index.php on line 30
[01/Jan/2024:00:03:45 +0000] [warn] [client 192.168.1.152] ModSecurity: Access denied with code 403 (phase 2). Matched phrase "sql injection attempt" at REQUEST_URI. [file "/etc/modsecurity/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [line "50"] [id "942100"] [rev ""] [msg "SQL Injection Attack Detected via libinjection"] [data "Matched Data: SQL injection found within REQUEST_URI: /vulnerable.php?id=1'"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.0"] [maturity "0"] [accuracy "0"] [hostname "example.com"] [uri "/vulnerable.php"] [unique_id "YvKp2H8AAQEAAAxxBGIAAAAC"]
[01/Jan/2024:00:04:56 +0000] [error] [client 192.168.1.153] AH01071: Got error 'PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/db.php:15...'
[01/Jan/2024:00:05:67 +0000] [warn] [client 192.168.1.154] ModSecurity: Warning. Matched "Operator \`Ge' with parameter \`5' against variable \`TX:ANOMALY_SCORE' (Value: \`5' ) [file "/etc/modsecurity/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "57"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.0"] [maturity "0"] [accuracy "0"] [hostname "example.com"] [uri "/admin"] [unique_id "YvKp2H8AAQEAAAxxBGIAAAAD"]
[01/Jan/2024:00:06:78 +0000] [error] [client 192.168.1.155] PCE: Can't open perl script "/var/www/html/cgi-bin/printenv": No such file or directory
[01/Jan/2024:00:07:89 +0000] [warn] [client 192.168.1.156] ModSecurity: Access denied with code 403 (phase 2). Matched phrase "directory traversal attempt" at ARGS:file. [file "/etc/modsecurity/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "75"] [id "930110"] [rev ""] [msg "Path Traversal Attack (/../)"] [data "Matched Data: ../ found within ARGS:file: ../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.0"] [maturity "0"] [accuracy "0"] [hostname "example.com"] [uri "/download.php"] [unique_id "YvKp2H8AAQEAAAxxBGIAAAAE"]
[01/Jan/2024:00:08:90 +0000] [error] [client 192.168.1.157] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /var/www/html/memory_hog.php on line 10
[01/Jan/2024:00:09:01 +0000] [warn] [client 192.168.1.158] ModSecurity: Warning. Pattern match "(?i:(?:[\s'\"`_''\(\)]*?(?:[\d\w]+[\s'\"`_''\(\)]*?){2,}[\s'\"`_''\(\)]*?(?:having|rongjitest|select|union|where|get_lst))" at ARGS:username. [file "/etc/modsecurity/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [line "1126"] [id "942480"] [rev ""] [msg "SQL Injection Attack"] [data "Matched Data: union select found within ARGS:username: admin' UNION SELECT password FROM users--"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.0"] [maturity "0"] [accuracy "0"] [hostname "example.com"] [uri "/login.php"] [unique_id "YvKp2H8AAQEAAAxxBGIAAAAF"]
[01/Jan/2024:00:10:12 +0000] [error] [client 192.168.1.159] AH01797: client denied by server configuration: /var/www/html/restricted/

Observa cómo head separa claramente la salida de cada archivo mediante encabezados. Esto es increíblemente útil cuando necesitas comparar rápidamente el inicio de varios archivos.

Uso de head con Tuberías (Pipes)

Como detective experto, a menudo necesitarás combinar comandos para filtrar y analizar datos de manera más efectiva. El comando head funciona perfectamente con tuberías, permitiéndote encadenarlo con otras herramientas.

Supongamos que quieres ver las primeras 3 líneas de access.log, pero solo las partes que muestran la marca de tiempo y el recurso solicitado. Puedes usar el comando cut junto con head para lograrlo:

cut -d '"' -f2 access.log | head -n 3

Este comando debería devolver:

POST /about HTTP/1.1
GET /dashboard HTTP/1.1
DELETE /comment HTTP/1.1

Esto es lo que hace este comando:

  1. cut -d '"' -f2 access.log: Divide cada línea usando las comillas como delimitador y selecciona el segundo campo, que contiene la solicitud HTTP.
  2. |: Envía (pipe) la salida del comando cut al comando head.
  3. head -n 3: Muestra únicamente las primeras 3 líneas de la entrada recibida.

Esta combinación te permite enfocarte rápidamente en partes específicas de las entradas del registro, haciendo tu investigación más eficiente.

Investigación con head y grep

Ahora, combinemos head con otro comando potente, grep, para buscar patrones específicos en nuestros registros.

Imagina que has recibido informes de actividad inusual relacionada con la página /admin. Quieres revisar las primeras apariciones de /admin en el registro de acceso:

grep "/admin" access.log | head -n 3

Este comando debería mostrar algo como:

192.168.1.148 - - [01/Jan/2024:00:00:33 +0000] "POST /admin/dashboard HTTP/1.1" 201 5546
192.168.1.115 - - [01/Jan/2024:00:00:22 +0000] "PUT /admin HTTP/1.1" 302 1113
192.168.1.163 - - [01/Jan/2024:00:00:56 +0000] "POST /admin/dashboard HTTP/1.1" 301 815

Este comando realiza lo siguiente:

  1. grep "/admin" access.log: Busca las líneas que contienen "/admin" dentro del archivo access.log.
  2. |: Pasa el resultado de grep al comando head.
  3. head -n 3: Muestra solo las primeras 3 líneas de la entrada procesada.

Esta combinación te permite centrarte rápidamente en las entradas relevantes de tu archivo de registro, haciendo que tu investigación sea más dirigida y eficaz.

Exploración de Archivos Grandes con head

Como detective de archivos, a menudo te encontrarás con archivos de registro muy pesados. El comando head es particularmente útil para examinar rápidamente el inicio de estos archivos sin necesidad de cargar todo su contenido en la memoria.

Simulemos el trabajo con un archivo grande utilizando el access.log con el que hemos estado trabajando. Fingiremos que es mucho más grande de lo que realmente es.

Primero, verifiquemos el tamaño del archivo:

ls -lh access.log

Ahora, usemos head para ver las primeras 15 líneas:

head -n 15 access.log

Deberías ver una salida similar a la anterior, pero con 15 líneas en lugar de 10.

El comando head es especialmente valioso al tratar con archivos muy grandes porque:

  1. Es rápido: head solo lee el principio del archivo, por lo que termina rápidamente incluso con archivos enormes.
  2. Es eficiente en memoria: head no necesita cargar el archivo completo en la memoria RAM.
  3. Ofrece una vista previa rápida: Puedes obtener una idea de la estructura y el contenido del archivo sin tener que abrirlo todo.

Resumen

En esta práctica de laboratorio, exploramos el comando head, una herramienta fundamental para examinar rápidamente el inicio de los archivos. Aprendimos a:

  1. Usar head para ver las primeras 10 líneas de un archivo por defecto.
  2. Personalizar el número de líneas mostradas mediante la opción -n.
  3. Examinar múltiples archivos simultáneamente con head.
  4. Combinar head con otros comandos como cut y grep utilizando tuberías.
  5. Utilizar head para trabajar de manera eficiente con archivos de gran tamaño.

Otros parámetros de head no cubiertos en este laboratorio:

  • -c: Muestra los primeros bytes de un archivo en lugar de líneas.
  • -q: Omite los encabezados al examinar múltiples archivos.
  • -v: Muestra siempre los encabezados al examinar múltiples archivos.

Recursos