Команда head в Linux: отображение начала файла

LinuxBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе мы рассмотрим команду head в Linux — мощную утилиту для быстрого просмотра начала текстовых файлов. Представьте себя цифровым детективом, которому нужно оперативно просмотреть множество файлов и найти важную информацию. Команда head станет вашей надёжной лупой: с её помощью можно заглянуть в начало файла, не открывая его целиком.

Мы смоделируем ситуацию, в которой вы исследуете набор журналов загруженного веб-сервера. Ваша задача — эффективно просмотреть эти журналы, выявить возможные проблемы и получить полезные сведения. В ходе практического упражнения вы научитесь правильно применять команду head, чтобы ускорить и упростить работу с файлами.

Основы работы с head

На этом шаге вы изучите простой файл журнала и разберётесь, как работает head.

Сначала перейдите в каталог проекта:

cd /home/labex/project

Теперь применим команду head к файлу access.log:

head access.log

Вы должны увидеть примерно такой результат:

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

По умолчанию head отображает первые 10 строк файла. Каждая строка этого журнала соответствует одному запросу к веб-серверу и содержит IP-адрес, временную метку, HTTP-метод, запрошенный ресурс, код состояния и размер ответа.

Настройка количества строк

На этом шаге вы настроите количество строк, отображаемых командой head.

Чтобы просмотреть только первые 5 строк журнала, используйте параметр -n:

head -n 5 access.log

Команда должна вывести:

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

Это особенно удобно, когда нужно найти конкретную информацию в начале файла, но нет необходимости просматривать все 10 строк.

Просмотр нескольких файлов

На этом шаге вы с помощью head одновременно просмотрите начало нескольких файлов.

Исследуем начало файлов access.log и error.log:

head access.log error.log

Вы должны увидеть примерно такой результат:

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

Обратите внимание: head наглядно разделяет вывод для каждого файла с помощью заголовков. Это особенно полезно, когда нужно быстро сопоставить начало нескольких файлов.

Использование head с конвейерами

На этом шаге вы объедините head с другой командой с помощью конвейера.

Предположим, вам нужно просмотреть первые 3 строки файла access.log, но оставить только временную метку и запрошенный ресурс. Для этого можно использовать команду cut вместе с head:

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

Команда должна вывести:

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

Фрагмент cut -d '"' -f2 access.log разделяет каждую строку по кавычкам и выбирает второе поле, содержащее HTTP-запрос. Символ | передаёт этот результат команде head -n 3, которая отображает только первые три строки.

Такое сочетание команд позволяет быстро сосредоточиться на нужных частях записей журнала и сделать расследование более эффективным.

Исследование с помощью head и grep

На этом шаге вы объедините head с grep, чтобы найти в журнале определённый шаблон.

Предположим, поступили сообщения о подозрительной активности, связанной со страницей /admin. Вы хотите проверить первые несколько вхождений /admin в журнале доступа:

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

Команда должна вывести примерно следующее:

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

Фрагмент grep "/admin" access.log ищет в access.log строки, содержащие /admin. Символ | передаёт найденные строки команде head -n 3, которая отображает только первые три совпадения.

Такое сочетание позволяет быстро выделить релевантные записи журнала и сделать поиск более целенаправленным и эффективным.

Работа с большими файлами с помощью head

На этом шаге вы воспользуетесь head, чтобы изучить большой файл журнала, не загружая всё его содержимое в память.

Смоделируем работу с большим файлом, используя уже знакомый нам access.log. Будем считать, что на самом деле он намного больше.

Сначала проверим размер файла:

ls -lh access.log

Теперь с помощью head просмотрим первые 15 строк:

head -n 15 access.log

Вы должны увидеть результат, похожий на предыдущий, но теперь в нём будет 15 строк вместо 10.

Команда head работает быстро, поскольку читает только начало файла, и экономно расходует память, так как не загружает весь файл целиком. Благодаря этому можно быстро получить представление о структуре и содержимом файла.

Итоги

В этой лабораторной работе мы изучили команду head — мощный инструмент для быстрого просмотра начала файлов. Мы научились:

  1. Использовать head для просмотра первых 10 строк файла по умолчанию.
  2. Настраивать количество отображаемых строк с помощью параметра -n.
  3. Одновременно просматривать несколько файлов с помощью head.
  4. Объединять head с другими командами, например cut и grep, используя конвейеры.
  5. Эффективно работать с большими файлами с помощью head.

Дополнительные параметры head, которые не рассматривались в этой лабораторной работе:

  • -c: отображать первые несколько байт файла вместо строк.
  • -q: скрывать заголовки при просмотре нескольких файлов.
  • -v: всегда отображать заголовки при просмотре нескольких файлов.