сортировать файл журнала по метке времени в командной строке Linux - PullRequest
13 голосов
/ 08 сентября 2011

У меня есть лог-файл с записями вроде:

...    
freeswitch.log:2011-09-08 12:21:07.282236 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda3525c0 in queue 0x7f2ce8005990, no more room! windex == rindex == 58!
freeswitch.log:2011-08-08 13:21:07.514261 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda354460 in queue 0x7f2ce8005990, no more room! windex == rindex == 58!
freeswitch.log:2011-06-04 16:21:08.998227 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda356300 in queue 0x7f2ce8005990, no more room! windex == rindex == 58! 
freeswitch.log:2011-09-08 12:21:10.374238 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda3581a0 in queue 0x7f2ce8005990, no more room! windex == rindex == 58!
...

Как мне отсортировать файл с помощью инструментов командной строки linux по отметке времени в каждой убывающей строке?

Ответы [ 7 ]

17 голосов
/ 08 апреля 2015

Использование сортировка --stable, --reverse и --key опции:

sort --stable --reverse --key=1,2 freeswitch.log

(Для недидактических целей его можно сократить до -srk1,2.)

Команда sort (как и следовало ожидать) выводит каждую строку именованных файлов (или STDIN) в отсортированном порядке. Что делает каждый из этих вариантов:

  • Опция --reverse указывает sort сортировать строки с большими значениями (более поздние даты) выше , а не ниже. На основании других ответов предполагается, что это то, что вы подразумеваете под «по убыванию» (даже если этот вид сортировки обычно считается «возрастающим»). Если вы хотите отсортировать строки в хронологическом порядке, эту опцию опустите.
  • Опция --key=1,2 указывает sort использовать только первые два разделенных пробелами «поля» («freeswitch.log:» - префикс с указанием даты и времени) в качестве ключа для сортировки. Важно, чтобы вы указали поле last для использования, даже если вы сортируете только по одному полю (например, если каждая строка хранит время и дату вместе в стандартном поле ISO-8601, например freeswitch.log 2011-09-08T12:21:07.282236 , вы бы использовали -k 2,2), так как по умолчанию поля, используемые ключом, простираются до конца строки .
  • Опция --stable указывает sort не выполнять «последнее средство заказа». Без этой опции строка с двумя равными ключами (как указано в опции --keys) будет затем отсортирована в соответствии с всей строкой , что означает, что имя файла и / или содержимое изменит порядок сортировки строк.

Важно указать оба экстента --key, а также параметр --stable. Без них несколько строк вывода, которые произошли одновременно (другими словами, многострочное сообщение), будут отсортированы в соответствии с содержимым сообщения (без второго поля в --key) и / или именем файла ( без --stable, если имя файла является отдельным полем, как описано ниже).

Другими словами, сообщение в журнале выглядит так:

freeswitch.log:2011-09-08 12:21:10.374238 Warning: Syntax error on line 20:
freeswitch.log:2011-09-08 12:21:10.374238
freeswitch.log:2011-09-08 12:21:10.374238    My[brackets(call)
freeswitch.log:2011-09-08 12:21:10.374238               ^
freeswitch.log:2011-09-08 12:21:10.374238 Suggestion:
freeswitch.log:2011-09-08 12:21:10.374238   did you forget to
freeswitch.log:2011-09-08 12:21:10.374238   close your brackets?

будет "отсортировано" по:

freeswitch.log:2011-09-08 12:21:10.374238
freeswitch.log:2011-09-08 12:21:10.374238               ^
freeswitch.log:2011-09-08 12:21:10.374238   close your brackets?
freeswitch.log:2011-09-08 12:21:10.374238   did you forget to
freeswitch.log:2011-09-08 12:21:10.374238    My[brackets(call)
freeswitch.log:2011-09-08 12:21:10.374238 Suggestion:
freeswitch.log:2011-09-08 12:21:10.374238 Warning: Syntax error on line 20:

Это "отсортировано" (потому что "c" предшествует "d", а "S" предшествует "W"), но это не в порядке . Указание --stable (и ограничение --key ограниченным) пропустит дополнительную сортировку, а сохранит порядок , который вам нужен.


Кроме того, сортировка по этому комбинированному полю имени и даты будет работать, только если каждая строка в вашем выводе начинается с одного и того же имени файла. С учетом синтаксиса, который вы опубликовали, если у вашего ввода есть несколько разных имен файлов, которые вы хотите игнорировать при сортировке, вам нужно использовать программу типа sed, чтобы преобразовать имя файла в его собственное разделенное пробелами поле, а затем передать преобразованные строки в sort (после чего вы можете преобразовать разделители полей обратно):

sed 's/:/ /' freeswitch.log | sort -srk2,3 | sed 's/ /:/'

Обратите внимание, что поля, используемые ключом, изменены на 2,3, пропуская первое поле (имя файла).

12 голосов
/ 08 сентября 2011

Использовать sort 's -k flag:

sort -k1 -r freeswitch.log

Это позволит отсортировать файл в обратном порядке по первому ключу (то есть freeswitch.log: 2011-09-08 12: 21: 07.282236). Если имя файла всегда одинаковое (freeswitch.log), то оно должно быть отсортировано по дате.

1 голос
/ 08 сентября 2011

Вы можете попробовать использовать сортировку

sort -k1,2 file
1 голос
/ 08 сентября 2011

Грубый, но эффективный метод: добавьте в каждую строку числовое представление даты, выполните числовую сортировку, затем удалите дополнительную информацию.

Oneliner:

while IFS=' ' read -r name_date trailing ; do date=$(cut -d: -f2 <<<"$name_date") ; printf '%s:%s\n' $(date -d "$date" +%s) "$name_date $trailing" ; done < freeswitch.log | sort -k1 -t: | cut -d: -f2-

Сценарий оболочки:

#!/usr/bin/env bash

logfile="$1"

if [ -f "$logfile" ] ; then
    while IFS=' ' read -r name_date trailing ; do
            date=$(cut -d: -f2 <<<"$name_date")
        printf '%s:%s\n' $(date -d "$date" +%s) "$name_date $trailing"
    done < "$logfile" | sort -k1 -t: | cut -d: -f2-
fi

Примечание. Требуется дата GNU.

Если выходные данные в этой точке не соответствуют тому, что вы хотите, просто передать по каналу tac или изменить сценарий так, чтобы он также передавался -r до sort.

РЕДАКТИРОВАТЬ: я пропустил часть, где имя файла было буквально в каждой строке.Обновленная версия теперь действительно будет работать.

1 голос
/ 08 сентября 2011

Вы можете изменить сортировку с помощью

sort -r
0 голосов
/ 08 сентября 2011

Я предполагаю, что файл журнала добавляет новые данные в конце.Если это так, вы можете прочитать файл в обратном порядке.Попробуйте с помощью команды tail -r или cat .

0 голосов
/ 08 сентября 2011

Файл журнала выглядит по возрастанию, вы можете

tac yourlogfile

, который будет показывать обратный файл журнала.

...