Commande Linux head : Affichage du début d'un fichier

LinuxLinuxBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire (lab), nous allons explorer la commande head sous Linux, un outil puissant pour prévisualiser le début de fichiers texte. Imaginez que vous êtes un détective numérique chargé de parcourir rapidement de nombreux fichiers pour trouver des informations cruciales. La commande head sera votre loupe de confiance, vous permettant de jeter un coup d'œil au début des fichiers sans les ouvrir entièrement.

Nous allons simuler un scénario où vous enquêtez sur une collection de fichiers journaux (log files) provenant d'un serveur web chargé. Votre objectif est d'examiner efficacement ces journaux pour identifier les problèmes potentiels et recueillir des informations. Grâce à cet exercice pratique, vous apprendrez à utiliser efficacement la commande head, rendant vos tâches d'exploration de fichiers plus rapides et plus efficaces.


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{{"Commande Linux head : Affichage du début d'un fichier"}} linux/head -.-> lab-214302{{"Commande Linux head : Affichage du début d'un fichier"}} linux/grep -.-> lab-214302{{"Commande Linux head : Affichage du début d'un fichier"}} end

Comprendre les bases de la commande head

Commençons par examiner un simple fichier journal (log file) pour comprendre le fonctionnement de la commande head.

Tout d'abord, accédez au répertoire du projet :

cd /home/labex/project

Maintenant, utilisons la commande head sur un fichier nommé access.log :

head access.log

Vous devriez voir une sortie similaire à celle-ci :

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

Par défaut, la commande head affiche les 10 premières lignes du fichier. Chaque ligne de ce journal représente une seule requête au serveur web, montrant l'adresse IP, l'horodatage, la méthode HTTP, la ressource demandée, le code d'état et la taille de la réponse.

Personnaliser le nombre de lignes

Parfois, 10 lignes peuvent être trop nombreuses ou trop peu. Apprenons à personnaliser le nombre de lignes affichées par la commande head.

Pour afficher seulement les 5 premières lignes du journal (log), utilisez l'option -n :

head -n 5 access.log

Cette commande devrait afficher :

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

Cela peut être particulièrement utile lorsque vous recherchez des informations spécifiques au début d'un fichier mais que vous n'avez pas besoin de voir les 10 lignes.

Examiner plusieurs fichiers

En tant que détective de fichiers, vous avez souvent besoin de consulter rapidement plusieurs fichiers. La commande head vous permet de visualiser le début de plusieurs fichiers à la fois.

Examinons le début des fichiers access.log et error.log :

head access.log error.log

Vous devriez voir une sortie similaire à celle-ci :

==> 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/

Remarquez comment head sépare clairement la sortie de chaque fichier avec des en-têtes. Cela est incroyablement utile lorsque vous avez besoin de comparer rapidement le début de plusieurs fichiers.

Utiliser head avec des pipes

En tant que détective de fichiers expérimenté, vous avez souvent besoin de combiner des commandes pour filtrer et analyser les données plus efficacement. La commande head fonctionne bien avec les pipes (canalisations), vous permettant de la chaîner avec d'autres commandes.

Supposons que vous souhaitiez voir les 3 premières lignes de access.log, mais seulement les parties montrant l'horodatage et la ressource demandée. Vous pouvez utiliser la commande cut avec head pour y parvenir :

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

Cette commande devrait afficher :

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

Voici ce que fait cette commande :

  1. cut -d '"' -f2 access.log : Cette commande divise chaque ligne aux guillemets et sélectionne le deuxième champ, qui contient la requête HTTP.
  2. | : Cela canalise (pipe) la sortie de la commande cut vers la commande head.
  3. head -n 3 : Cela affiche seulement les 3 premières lignes de l'entrée canalisée.

Cette combinaison vous permet de vous concentrer rapidement sur des parties spécifiques des entrées de journal, rendant votre enquête plus efficace.

Enquêter avec head et grep

Maintenant, combinons head avec une autre commande puissante, grep, pour rechercher des motifs spécifiques dans nos journaux (logs).

Supposons que vous ayez reçu des rapports d'activités inhabituelles liées à la page /admin. Vous souhaitez vérifier les premières occurrences de /admin dans le journal d'accès :

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

Cette commande devrait afficher quelque chose comme :

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

Cette commande effectue les opérations suivantes :

  1. grep "/admin" access.log : Recherche les lignes contenant "/admin" dans le fichier access.log.
  2. | : Canalise (pipe) la sortie de grep vers la commande head.
  3. head -n 3 : Affiche seulement les 3 premières lignes de l'entrée canalisée.

Cette combinaison vous permet de vous concentrer rapidement sur les entrées pertinentes de votre fichier de journal, rendant votre enquête plus ciblée et efficace.

Explorer de grands fichiers avec head

En tant que détective de fichiers, vous rencontrez souvent des fichiers de journal très volumineux. La commande head est particulièrement utile pour examiner rapidement le début de ces fichiers sans charger tout le contenu en mémoire.

Simulons le travail avec un grand fichier en utilisant le fichier access.log avec lequel nous avons déjà travaillé. Nous allons supposer qu'il est beaucoup plus volumineux qu'il ne l'est en réalité.

Tout d'abord, vérifions la taille du fichier :

ls -lh access.log

Maintenant, utilisons head pour afficher les 15 premières lignes :

head -n 15 access.log

Vous devriez voir une sortie similaire à celle que nous avons déjà vue, mais avec 15 lignes au lieu de 10.

La commande head est particulièrement précieuse lorsqu'il s'agit de très grands fichiers car :

  1. Elle est rapide : head ne lit que le début du fichier, donc elle s'exécute rapidement même pour des fichiers énormes.
  2. Elle est économes en mémoire : head n'a pas besoin de charger tout le fichier en mémoire.
  3. Elle vous donne un aperçu rapide : Vous pouvez avoir une idée de la structure et du contenu du fichier sans ouvrir tout le fichier.

Résumé

Dans ce laboratoire (lab), nous avons exploré la commande head, un outil puissant pour examiner rapidement le début des fichiers. Nous avons appris à :

  1. Utiliser head pour afficher les 10 premières lignes d'un fichier par défaut.
  2. Personnaliser le nombre de lignes affichées en utilisant l'option -n.
  3. Examiner plusieurs fichiers simultanément avec head.
  4. Combiner head avec d'autres commandes telles que cut et grep en utilisant des pipes (canalisations).
  5. Utiliser head pour travailler efficacement avec de grands fichiers.

Paramètres supplémentaires de head non couverts dans ce laboratoire :

  • -c : Afficher les premiers octets d'un fichier au lieu des lignes.
  • -q : Supprimer les en-têtes lors de l'examen de plusieurs fichiers.
  • -v : Toujours afficher les en-têtes lors de l'examen de plusieurs fichiers.

Ressources