2010-08-24 2 views
1

Мне нужно извлечь некоторую информацию из файла журнала с помощью сценария оболочки (bash). Строка из файла журнала, как правило, выглядит следующим образом:Выбор временных интервалов из файлов журнала с помощью Bash

2009-10-02 15:41:13,796| some information 

Иногда такая линия следуют еще несколько строк, дающих сведения о событии. Эти дополнительные строки не имеют определенного формата (в частности, они не начинаются с метки времени).

Я знаю, как использовать grep для фильтрации файла на основе ключевых слов и выражений. В основном у меня возникают проблемы с тем, что иногда мне приходится смотреть только на определенные интервалы времени. Например, мне нужно посмотреть только на события, которые произошли за последние X минут. Я не испытываю сценариев оболочки, но из-за сложности формата времени это кажется довольно сложной задачей для меня. С другой стороны, я могу себе представить, что это что-то не слишком необычное, поэтому мне интересно, есть ли какие-то инструменты, которые могут сделать это проще для меня, или если вы можете дать мне несколько советов о том, как решить эту проблему?

+0

Спасибо за все ответы. К сожалению, многие вещи не поддерживаются на сервере (нет даты с параметром% s, ни phython, ни systime() тоже не работают). Я решил использовать Perl сейчас, так как он предлагает некоторые удобные функции времени, которые отсутствуют. Тем не менее, ваши комментарии дали мне много полезных советов! – bufferUnderrun

ответ

1
gawk -F"[-: ]" 'BEGIN{ 
    fivemin = 60 * 60 * 5 #last 5 min 
    now=systime() 
    difference=now - fivemin 
} 
/^20/{ 
    yr=$1 
    mth=$2 
    day=$3 
    hr=$4 
    min=$5 
    sec=$5 
    t1=mktime(yr" "mth" "day" "hr" "min" "sec) 
    if (t1 >= difference) { 
    print 
    } 
}' file 
+0

@ ghostdog74: Это, похоже, не обрабатывает лишние строки информации, которые OP имеет в своем файле журнала. Мне это нравится. –

0

Вы можете взглянуть на my Python program, который извлекает данные из лог-файлов на основе диапазона времени. Спецификация дат еще не реализована (она предназначена для просмотра примерно последних 24 часов). Формат времени, который он ожидает (например, 14 января 04:10:13), выглядит немного иначе, чем то, что вы хотите, но это может быть адаптировано. Я не тестировал его с не timestamped строк, но он должен печатать все в пределах указанного диапазона раз.

Это даст вам информацию об использовании:

timegrep.py --help 
1

В основном то, что у меня возникают проблемы с является то, что иногда мне нужно смотреть на только определенные промежутки времени.

Вы можете использовать date для преобразования даты подписи для вас с %s параметра:

%s  seconds since 1970-01-01 00:00:00 UTC 

С его помощью мы можем сделать небольшую демонстрацию:

#!/bin/bash 

timespan_seconds=300 # 5 minutes 

time_specified=$(date +"%s" -d "2010-08-25 14:54:40") 

let time_now=$(date +"%s") 
let time_diff=($time_now - $timespan_seconds) 

if [ $time_specified -ge $time_diff ]; then 
     echo "Time is within range" 
fi 

Заметьте, что это Безразлично Не обращайте внимания на будущее.

Смежные вопросы