Фильтрация записей журнала
Одним из преимуществ AWK является его способность фильтровать данные на основе условий. Давайте воспользуемся этой возможностью, чтобы найти все POST-запросы в нашем журнале, так как они могут быть более чувствительными с точки зрения безопасности, чем GET-запросы.
Запустите следующую команду:
awk '$4 == "POST" {print $0}' server_logs.txt
Разберём синтаксис этой команды, чтобы понять, как работает фильтрация в AWK:
-
$4 == "POST"
- Это шаблон или условие, которое AWK оценивает для каждой строки:
$4
ссылается на четвёртое поле текущей строки (в нашем журнале это HTTP-метод)
==
- это оператор равенства, который проверяет, равны ли два значения
"POST"
- это строка, с которой мы сравниваем
-
{print $0}
- Это действие, которое AWK выполняет, когда условие истинно:
- Круглые скобки
{}
заключают действие
print
- это команда для вывода текста
$0
представляет собой всю текущую строку (все поля)
Структура команды соответствует шаблону AWK: условие {действие}
. AWK считывает каждую строку, и если условие оценивается как истинное, он выполняет действие. Если условие не указано (как в наших предыдущих примерах), действие выполняется для каждой строки.
Вы должны увидеть вывод, похожий на следующий:
2023-08-01 08:17:30 192.168.1.102 POST /login.php 302
2023-08-01 09:23:45 192.168.1.110 POST /submit_form.php 200
2023-08-01 10:45:12 192.168.1.115 POST /upload.php 500
Теперь найдём все запросы, которые завершились статусом 404 (Не найдено):
awk '$6 == "404" {print $1, $2, $5}' server_logs.txt
Эта команда следует тому же шаблону, но с другими значениями:
- Условие
$6 == "404"
проверяет, равно ли шестое поле (код статуса) 404
- Действие
{print $1, $2, $5}
выводит только определенные поля:
$1
- Первое поле (дата)
$2
- Второе поле (время)
$5
- Пятое поле (запрашиваемый ресурс)
Такой выборочный вывод позволяет вам сосредоточиться только на нужной вам информации.
Вывод:
2023-08-01 08:18:12 /products.html
2023-08-01 09:30:18 /nonexistent.html
2023-08-01 11:05:30 /missing_page.html
Вы можете комбинировать несколько условий, используя логические операторы:
&&
для операции И (оба условия должны быть истинными)
||
для операции ИЛИ (хотя бы одно условие должно быть истинным)
!
для операции НЕ (инвертирует условие)
Например, чтобы найти все POST-запросы, которые завершились ошибкой (код статуса >= 400):
awk '$4 == "POST" && $6 >= 400 {print $0}' server_logs.txt
Эти фильтры помогут вам быстро выявить потенциальные проблемы или подозрительную активность в журналах сервера.