Comando head de Linux: Visualización del inicio de archivos

LinuxLinuxBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, exploraremos el comando head en Linux, una poderosa utilidad para previsualizar el inicio de archivos de texto. Imagina que eres un detective digital encargado de revisar rápidamente numerosos archivos para encontrar información crucial. El comando head será tu confiable lupa, que te permitirá echar un vistazo al inicio de los archivos sin abrirlos por completo.

Simularemos un escenario en el que estás investigando una colección de archivos de registro de un servidor web ocupado. Tu objetivo es examinar eficientemente estos registros para identificar posibles problemas y recopilar información útil. A través de este ejercicio práctico, aprenderás a usar el comando head de manera efectiva, lo que hará que tus tareas de exploración de archivos sean más rápidas y eficientes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/head("File Beginning Display") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/ls -.-> lab-214302{{"Comando head de Linux: Visualización del inicio de archivos"}} linux/head -.-> lab-214302{{"Comando head de Linux: Visualización del inicio de archivos"}} linux/grep -.-> lab-214302{{"Comando head de Linux: Visualización del inicio de archivos"}} end

Comprendiendo los conceptos básicos de head

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

Primero, navega al directorio del proyecto:

cd /home/labex/project

Ahora, usemos 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 sola 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.

Personalizando el número de líneas

A veces, 10 líneas pueden ser demasiadas o demasiado pocas. Aprendamos cómo personalizar el número 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 mostrar la siguiente salida:

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 puede ser especialmente útil cuando estás buscando información específica cerca del inicio de un archivo pero no necesitas ver las 10 líneas.

Examinando múltiples archivos

Como detective de archivos, a menudo necesitas revisar rápidamente múltiples archivos. El comando head te permite ver el inicio de múltiples archivos a la vez.

Examinemos el inicio de ambos 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 con encabezados. Esto es increíblemente útil cuando necesitas comparar rápidamente el inicio de múltiples archivos.

Usando head con tuberías (pipes)

Como un hábil detective de archivos, a menudo necesitas combinar comandos para filtrar y analizar datos de manera más efectiva. El comando head funciona bien con tuberías (pipes), lo que te permite encadenarlo con otros comandos.

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

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

Este comando debería mostrar la siguiente salida:

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: Este comando divide cada línea en las comillas dobles y selecciona el segundo campo, que contiene la solicitud HTTP.
  2. |: Esta tubería (pipe) envía la salida del comando cut al comando head.
  3. head -n 3: Este comando muestra solo las primeras 3 líneas de la entrada canalizada.

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

Investigando con head y grep

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

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

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

Este comando debería mostrar una salida como esta:

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 hace lo siguiente:

  1. grep "/admin" access.log: Busca líneas que contengan "/admin" en el archivo access.log.
  2. |: Canaliza (pipe) la salida de grep al comando head.
  3. head -n 3: Muestra solo las primeras 3 líneas de la entrada canalizada.

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

Explorando archivos grandes con head

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

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

Primero, comprobemos 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 que hemos visto antes, pero con 15 líneas en lugar de 10.

El comando head es especialmente valioso cuando se trata de archivos muy grandes porque:

  1. Es rápido: head solo lee el inicio del archivo, por lo que se completa rápidamente incluso para archivos enormes.
  2. Es eficiente en memoria: head no necesita cargar todo el archivo en la memoria.
  3. Te da una vista previa rápida: Puedes tener una idea de la estructura y el contenido del archivo sin abrirlo por completo.

Resumen

En este laboratorio, exploramos el comando head, una herramienta poderosa para examinar rápidamente el inicio de archivos. Aprendimos cómo:

  1. Usar head para ver las primeras 10 líneas de un archivo por defecto.
  2. Personalizar el número de líneas mostradas utilizando 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 (pipes).
  5. Usar head para trabajar de manera eficiente con archivos grandes.

Parámetros adicionales de head no cubiertos en este laboratorio:

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

Recursos