Как извлечь и отсортировать столбцы из файлов журнала в Linux
Сортировка файла журнала по определенному столбцу полезна для быстрого поиска информации. Журналы обычно хранятся в виде открытого текста, поэтому вы можете использовать инструменты командной строки для работы с текстом, чтобы обрабатывать их и просматривать в более удобном для чтения виде.
Извлечение столбцов с помощью cut и awk
Утилиты cut
и awk
– это два разных способа извлечения столбца информации из текстовых файлов. Оба предполагают, что ваши файлы журналов разделены пробелами, например:
column column column
Это представляет проблему, если данные в столбцах содержат пробелы, например даты («Среда, 12 июня»). Хотя cut
может видеть это как три отдельных столбца, вы все равно можете извлечь все три из них одновременно, предполагая, что структура вашего файла журнала непротиворечива.
cut
очень прост в использовании:
cat system.log | cut -d ' ' -f 1-6
Команда cat
считывает содержимое system.log
и передает его в cut
. Флаг -d
указывает разделитель, в данном случае это пробел. (По умолчанию используется вкладка, t
.) Флаг -f
указывает, какие поля выводить. Эта команда напечатает первые шесть столбцов system.log
. Если вы хотите напечатать только третий столбец, используйте флаг -f 3
.
awk
более мощный, но не такой лаконичный. cut
полезно для извлечения столбцов, например, если вы хотите получить список IP-адресов из журналов Apache. awk
может переупорядочивать целые строки, что может быть полезно для сортировки всего документа по определенному столбцу. awk
– это полноценный язык программирования, но вы можете использовать простую команду для печати столбцов:
cat system.log | awk '{print $1, $2}'
awk
выполняет вашу команду для каждой строки в файле. По умолчанию он разбивает файл по пробелам и сохраняет каждый столбец в переменных $1
, $2
, $3
и т. д. С помощью команды print $1
вы можете распечатать первый столбец, но нет простого способа распечатать диапазон столбцов без использования циклов.
Одним из преимуществ awk
является то, что команда может ссылаться на всю строку сразу. Содержимое строки сохраняется в переменной $0
, которую можно использовать для печати всей строки. Итак, вы могли бы, например, напечатать третий столбец перед печатью остальной части строки:
awk '{print $3 " " $0}'
\ \
выводит пробел между $3
и $0
. Эта команда дважды повторяет третий столбец, но это можно обойти, задав для переменной $3
значение null:
awk '{printf $3; $3=""; print " " $0}'
Команда printf
не печатает новую строку. Точно так же вы можете исключить определенные столбцы из вывода, установив для них пустые строки перед печатью $0
:
awk '{$1=$2=$3=""; print $0}'
С помощью awk
можно делать намного больше, включая сопоставление регулярных выражений, но стандартное извлечение столбцов хорошо подходит для этого случая использования.
Сортировка столбцов с помощью sort и uniq
Команду sort
можно использовать для упорядочения списка данных на основе определенного столбца. Синтаксис:
sort -k 1
где флаг -k
обозначает номер столбца. Вы передаете ввод в эту команду, и она выдает упорядоченный список. По умолчанию sort
использует алфавитный порядок, но поддерживает дополнительные параметры с помощью флагов, например -n
для числовой сортировки, -h
для сортировки по суффиксу (1M > 1K), -M
для сортировки сокращений месяцев и -V
для сортировки номеров версий файлов (file-1.2.3 > file-1.2.1).
Команда uniq
отфильтровывает повторяющиеся строки, оставляя только уникальные. Он работает только для смежных строк (из соображений производительности), поэтому вам нужно всегда использовать его после sort
, чтобы удалить дубликаты по всему файлу. Синтаксис прост:
sort -k 1 | uniq
Если вы хотите указать только дубликаты, используйте флаг -d
.
uniq
также может подсчитывать количество дубликатов с помощью флага -c
, что делает его очень удобным для отслеживания частоты. Например, если вы хотите получить список наиболее часто встречающихся IP-адресов вашего сервера Apache, вы можете запустить следующую команду в своем access.log
:
cut -d ' ' -f 1 | sort | uniq -c | sort -nr | head
Эта строка команд вырежет столбец IP-адреса, сгруппирует дубликаты вместе, удалит дубликаты при подсчете каждого появления, затем отсортирует на основе столбца счетчика в порядке убывания, оставив вам список, который выглядит следующим образом:
21 192.168.1.1 12 10.0.0.1 5 1.1.1.1 2 8.0.0.8
Вы можете применить эти же методы к своим файлам журналов в дополнение к другим утилитам, таким как awk
и sed
, чтобы извлечь полезную информацию. Эти объединенные в цепочку команды длинные, но вам не нужно вводить их каждый раз, так как вы всегда можете сохранить их в скрипте bash или использовать псевдоним через свой ~/.bashrc
.
Фильтрация данных с помощью grep и awk
grep
– очень простая команда. вы даете ему поисковый запрос и передаете ему ввод, и он выдает каждую строку, содержащую этот поисковый запрос. Например, если вы хотите найти в журнале доступа Apache ошибки 404, вы можете сделать следующее:
cat access.log | grep "404"
который выдаст список записей журнала, соответствующих заданному тексту.
Однако grep
не может ограничить поиск определенным столбцом, поэтому эта команда завершится ошибкой, если где-то еще в файле есть текст «404». Если вы хотите искать только в столбце кода состояния HTTP, вам нужно использовать awk
:
cat access.log | awk '{if ($9 == "404") print $0;}'
С awk
у вас также есть возможность выполнять отрицательный поиск. Например, вы можете искать все записи журнала, которые не вернулись с кодом состояния 200 (ОК):
cat access.log | awk '{if ($9 != "200") print $0;}'
а также иметь доступ ко всем программным функциям, которые предоставляет awk
.
Параметры графического интерфейса для веб-журналов
GoAccess — это утилита CLI для мониторинга журнала доступа вашего веб-сервера в режиме реального времени, которая сортируется по каждому полезному полю. Он полностью работает в вашем терминале, поэтому вы можете использовать его через SSH, но он также имеет гораздо более интуитивно понятный веб-интерфейс.
apachetop
– это еще одна утилита специально для apache, которую можно использовать для фильтрации и сортировки по столбцам в журнале доступа. Он работает в режиме реального времени прямо в вашем access.log.