Поиск по сайту:

Как извлечь и отсортировать столбцы из файлов журнала в 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.