3 инструмента, которые упрощают анализ логов
От сырых логов — к понятным выводам
Это перевод оригинальной статьи 3 Tools That Make Log Analysis Effortless.
Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.
Логи неструктурированы и содержат много шума, но мы можем за считанные секунды превратить их в удобочитаемый источник информации.
В этой статье мы рассмотрим три основных инструмента для обработки текста: grep, sed и awk. Они входят в состав Unix-систем с 1970-х годов и до сих пор широко используются, поскольку при быстром анализе данных непосредственно на системе нередко оказываются эффективнее современных панелей анализа логов.
#1. grep: универсальный инструмент поиска
grep часто становится отправной точкой при анализе логов, поскольку помогает отфильтровать шум и сосредоточиться на действительно важной информации.
Его задача проста: находить строки, соответствующие заданному шаблону. Вместо того чтобы просматривать тысячи записей логов, одной командой можно быстро извлечь ошибки, предупреждения или интересующие события.
Применение:
grep последовательно анализирует каждую строку входных данных и выводит только те строки, которые соответствуют заданному шаблону. При работе с логами наиболее полезны следующие параметры:
grep [OPTIONS] PATTERN [FILE...] # Essential flags -i # case-insensitive match -E # extended regex (ERE) — enables +, ?, |, () -v # invert: show non-matching lines -c # count matching lines instead of printing them -n # prefix each line with its line number -o # print only the matched portion, not the whole line -A N # show N lines After the match -B N # show N lines Before the match -C N # show N lines of Context (before + after) -r # recursive — search all files in a directory tree --no-filename / -h # suppress filename prefix
Практические шаблоны для работы с логами:
# Search for lines containing ERROR or CRITICAL in the application log grep -E "ERROR|CRITICAL" /var/log/app/app.log
# Search for system crashes or memory issues # and show 5 lines of context before and after matches grep -C 5 "panic\|segfault\|OOM killer" /var/log/syslog
# Count occurrences of HTTP 5xx server errors (500–599) # in all Nginx log files grep -rc " 5[0-9][0-9] " /var/log/nginx/
# Find unique IP addresses that received 403 Forbidden responses # in the Nginx access log grep ' 403 ' /var/log/nginx/access.log | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort -u
# Find ERROR logs while excluding noise # from health, ping, and metrics endpoints grep "ERROR" /var/log/app/app.log | grep -v "/health\|/ping\|/metrics"
# Search compressed log files for WARN or ERROR messages zgrep -E "WARN|ERROR" /var/log/app/app.log.*.gz
# Match a timestamp prefix (ISO 8601)
grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}"
# Match lines containing an IPv4 address
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
# Match HTTP method + path
grep -oE '"(GET|POST|PUT|DELETE|PATCH) [^"]*"'
# Match lines between 14:00 and 14:59 (useful for incidents)
grep "^2024-.*T14:"
# Match lines that contain a UUID
grep -oE "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"Примечание:
При работе с логами объёмом в несколько гигабайт используйтеLC_ALL=C, чтобы ускорить поиск:LC_ALL=C grep “ERROR” /var/log/huge.log. Это позволяет ускорить работуgrepв 2–4 раза, поскольку исключается обработка многобайтовых символов.
#2. sed: преобразование текста
sed — мощный инструмент для преобразования текста, который позволяет изменять текст непосредственно из командной строки. С его помощью можно заменять слова, удалять ненужные строки, изменять формат вывода и очищать данные логов, не открывая текстовый редактор.
При анализе логов sed чаще всего используется для преобразования необработанного вывода в более чистый и удобочитаемый формат.
Применение:
sed построчно читает входные данные и применяет к каждой строке заданные команды редактирования. При анализе логов он чаще всего используется для следующих задач:
- удаление или маскирование конфиденциальных данных перед передачей логов;
- приведение временных меток или формата полей к единому виду;
- удаление из потока лишнего шума;
- извлечение фрагмента большого лога за определённый промежуток времени.
sed [OPTIONS] 'COMMAND' [FILE...] # Essential flags -n # suppress automatic printing (use with p command) -E # extended regex -i[SUFFIX] # edit file in-place (dangerous on production — pipe instead) # Core commands s/PATTERN/REPLACEMENT/FLAGS # substitute d # delete matching line p # print matching line /PATTERN/,/PATTERN/ CMD # address range: apply CMD between two patterns q # quit after first match
Практические шаблоны для работы с логами:
# Mask credit card numbers in logs by replacing them with a placeholder
sed -E 's/\b[0-9]{4}[- ]?[0-9]{4}[- ]?[0-9]{4}[- ]?[0-9]{4}\b/****-****-****-****/g' app.log# Redact sensitive tokens (Bearer tokens or token= values) from logs sed -E 's/(Bearer |token=)[A-Za-z0-9._-]+/\1[REDACTED]/g' app.log
# Normalize log levels by converting them to uppercase # (DEBUG, INFO, WARN, ERROR, CRITICAL) sed -E 's/\[(debug|info|warn|error|critical)\]/[\U\1]/gi' app.log
# Remove health check, ping, and metrics requests from Nginx access logs sed -E '/GET \/health|GET \/ping|GET \/metrics/d' /var/log/nginx/access.log
# Extract log entries between two timestamps (14:00 to 14:30 on 2024-11-15) sed -n '/2024-11-15T14:00/,/2024-11-15T14:30/p' app.log
- Извлечь первые 1000 строк с ошибками ERROR и затем прекратить чтение файла (быстрый первичный анализ):
# Print up to the first 1000 ERROR lines from the log file
sed -n '/ERROR/{p;/ERROR/{1000q}}' app.log
# Simpler alternative using grep and head
grep "ERROR" app.log | head -1000# Convert Apache/Nginx timestamps to ISO 8601 format
# Before: [15/Nov/2024:14:32:01 +0700]
# After: 2024-11-15T14:32:01+07:00
sed -E 's|\[([0-9]{2})/([A-Za-z]{3})/([0-9]{4}):([0-9:]+) ([+-][0-9]{2})([0-9]{2})\]|\3-\2-\1T\4\5:\6|' access.log# Remove ANSI color codes from terminal output logs sed -E 's/\x1B\[[0-9;]*[mGKHF]//g' colored.log
- Удалить строки DEBUG непосредственно в копии файла (никогда не делать этого с оригиналами в production):
# Create a working copy of the log file and remove all DEBUG lines in-place cp app.log app.log.work sed -i -E '/^\[DEBUG\]/d' app.log.work
# This is sed's most powerful feature for log slicing.
# The general form is:
# sed -n '/START_PATTERN/,/END_PATTERN/p' file
# Extract from first FATAL match to end of file
sed -n '/FATAL/,$p' app.log
# Extract first transaction block and stop at COMMIT or ROLLBACK
sed -n '/BEGIN TRANSACTION/,/ROLLBACK\|COMMIT/{p;/ROLLBACK\|COMMIT/q}' db.log
# Keep only logs within a specific time window (incident analysis)
sed -n '/2024-11-15T14:00/,/2024-11-15T15:00/p' app.log > incident_window.log#3. awk: Инструмент для анализа данных
awk — это инструмент для работы со структурированным текстом, таким как логи, CSV-файлы или табличные данные. Он разбивает каждую строку на поля, благодаря чему можно легко извлекать нужные столбцы, фильтровать данные и выполнять вычисления.
При анализе логов awk часто используется для агрегирования результатов, извлечения определённых значений и преобразования необработанных логов в полезные отчёты.
Применение:
awk рассматривает каждую строку как запись, разделённую на поля с помощью разделителя (по умолчанию — пробельные символы). Затем он выполняет программу вида condition { action } для каждой записи.
awk 'BEGIN { setup } /pattern/ { action } END { teardown }' file$0→ вся строка целиком$1,$2, …$NF→ первое, второе, … последнее полеNF→ количество полей в текущей записиNR→ номер текущей записи (строки)FS→ разделитель входных полей (задаётся с помощью -F или в BEGIN)OFS→ разделитель выходных полейFILENAME→ имя текущего входного файла
Практические шаблоны для работы с логами:
# Sum response sizes from Nginx access logs and display total in MB
awk '{sum += $10} END {printf "Total: %.2f MB\n", sum/1024/1024}' /var/log/nginx/access.log# Count HTTP status codes in Nginx access logs and display them sorted by frequency
awk '{print $9}' /var/log/nginx/access.log \
| sort | uniq -c | sort -rn \
| awk '{printf " %s %d\n", $2, $1}'- Подсчитать количество запросов с каждого IP-адреса и вывести первые 20 (анализ DDoS-атак и злоупотреблений):
# Extract client IPs, count requests per IP, sort by highest activity, and show top 20
awk '{print $1}' /var/log/nginx/access.log \
| sort | uniq -c | sort -rn | head -20# Analyze API performance: count requests, max latency, and average response time per endpoint
awk '/duration_ms=/ {
match($0, /duration_ms=([0-9]+)/, arr)
match($0, /(GET|POST|PUT|DELETE|PATCH) ([^ ]+)/, req)
if (arr[1]+0 > max[req[2]]) max[req[2]] = arr[1]+0
total[req[2]] += arr[1]+0
count[req[2]]++
}
END {
printf "%-40s %10s %10s %10s\n", "Endpoint", "Count", "Max(ms)", "Avg(ms)"
printf "%-40s %10s %10s %10s\n", "--------", "-----", "-------", "-------"
for (ep in count)
printf "%-40s %10d %10d %10.1f\n", ep, count[ep], max[ep], total[ep]/count[ep]
}' app.log | sort -k4 -rn | head -20# Count ERROR logs per minute (HH:MM) from timestamps in the log
awk '/ERROR/ {
# Extract HH:MM from ISO timestamp in $1
match($1, /T([0-9]{2}:[0-9]{2})/, t)
minute = t[1]
errors[minute]++
}
END {
for (m in errors) print m, errors[m]
}' app.log | sort# Parse JSON-like logs, extract ERROR entries, and print time, message, and latency
awk -F'"' '
/\"level\":\"ERROR\"/ {
for (i=1; i<=NF; i++) {
if ($i == "time") ts = $(i+2)
if ($i == "msg") msg = $(i+2)
}
# Extract numeric latency value
match($0, /"latency":([0-9]+)/, arr)
printf "[%s] %s (latency=%sms)\n", ts, msg, arr[1]
}' app.log# Count ERROR lines per log file and display sorted results (by error count)
awk '
/ERROR/ { errors[FILENAME]++ }
END {
for (f in errors) {
n = split(f, parts, "/")
printf "%-30s %d errors\n", parts[n], errors[f]
}
}' /var/log/services/*.log | sort -k2 -rn# Detect repeated authentication failures by IP
# and alert on suspicious activity
awk '/authentication failure/ {
match($0, /rhost=([0-9.]+)/, ip)
if (ip[1] != "") failures[ip[1]]++
}
END {
for (ip in failures)
if (failures[ip] >= 10)
printf "ALERT: %s — %d failures\n", ip, failures[ip]
}' /var/log/auth.log | sort -t= -k2 -rnСочетание трех элементов: идеальный конвейер
Настоящая сила этих инструментов раскрывается, когда мы объединяем их с помощью конвейеров Linux (|). Вместе grep, sed и awk охватывают три основные операции анализа логов:
grep: Фильтр → поиск строк, соответствующих заданному шаблону. Инструмент поиска по логам.sed: Преобразование → редактирование или переформатирование текста в потоке данных. Этап поиска и замены в конвейере.awk: Обработка данных → разбор полей, агрегирование данных и формирование отчётов. Небольшая электронная таблица в командной строке.
Практические примеры конвейеров обработки данных:
# Extract timestamp and last field for ERROR logs
cat app.log | grep "ERROR" | awk '{print $1, $2, $NF}'# Count and sort unique IP addresses by request frequency
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr# Find log lines containing user= and replace it with USER: cat app.log | grep "user=" | sed 's/user=/USER:/g'
# Find URLs that returned 500 errors and count their frequency
cat access.log | grep " 500 " | awk '{print $7}' | sort | uniq -c | sort -nr# Extract timestamp, service, and last field from request logs
# while removing DEBUG tags
cat app.log | grep "request_id=" | sed 's/DEBUG//g' | awk '{print $1, $5, $NF}'Примечание:
Эти конвейеры нужны не для того, чтобы запоминать команды наизусть. Их задача — сформировать небольшой набор повторно используемых шаблонов, позволяющих за считанные секунды перейти от сырых логов к готовым ответам.
Заключение
Для того чтобы разбирать, фильтровать и извлекать полезную информацию из текстовых файлов, не нужен громоздкий стек ELK или дорогая SaaS-платформа. Одни из самых мощных инструментов анализа логов уже десятилетиями входят в состав Linux и находятся в каталоге /bin.
grep, sed и awk превращают анализ логов из утомительной задачи в быстрый и эффективный рабочий процесс. Они позволяют за считанные секунды превратить сырые логи в полезную информацию прямо в терминале, практически без дополнительных накладных расходов.
В этой статье мы рассмотрели, как с помощью grep, sed и awk можно быстро искать, фильтровать и анализировать логи непосредственно из терминала.
Спасибо за чтение! Надеюсь, эта статья поможет вам быстрее обрабатывать логи с помощью grep, sed и awk.
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.