2015-10-07 3 views
0

У меня есть журнал на сервере linux. Записи в формате:Фильтровать журналы Linux на основе временной отметки Unix

[метка времени (в секундах начиная с 1 января 1970 г.)] ввода данных журнала

мне нужно Баш скрипт, который будет принимать имя файла журнала и вывода только вчерашние записи (от 12 : 00 до 23:59:59 предыдущего дня) и выводят эти строки в новый файл.

Я видел различные сценарии, которые фильтруют журналы на основе дат, но все они до сих пор имеют дело с метками даты в более удобных для чтения форматах или не являются динамическими. Они полагаются на жестко закодированные даты. Мне нужен скрипт, который будет запускаться в ежедневном задании cron, поэтому он должен знать, какая текущая дата каждый раз выполняется.

Спасибо.

Обновление: Это то, что у меня есть до сих пор. Он просто никогда не делает оценку даты. Он печатает 00 для даты, так что все проходит.

head -5 logfile.log | awk '{ 
    if($1 >= (date -d "today 00:00:00" +"%s")) 
     print $1 (date -d "today 00:00:00" +"%s"); 
    }' 

Я запутался, хотя, даже если дата оценивает должным образом, $ 1 будет иметь номера в квадратных скобках, и моя дата будет только цифры. Будет ли он правильно сравнивать, если строки форматируются по-другому? Я еще не понял, как еще сунуть номер даты, возвращаемый по дате, в строку с скобками.

+0

Вы будете заинтересованы в '-D дата "вчера 00:00:00"' и '-D дата "вчера 23:59:59"' –

+0

рекомендую Ответ @ glennjackman, в сочетании с [awk conditionals] (http://www.thegeekstuff.com/2010/02/awk-conditional-statements/) –

+0

Я рекомендую добавить опцию даты '+"% s "'. – Cyrus

ответ

1

Ну, возможно, используя даты, как сказал Дейл. Но используя небольшой трюк, чтобы извлечь «[» и «]», и после сравнения дат. Что-то вроде этого:

ВЧЕРА = $ (дата -d "вчера 00:00:00" + "% s")

СЕГОДНЯ = $ (дата -d "сегодня 00:00:00" +» % s ")

AWK -v MIN = $ {ВЧЕРА} -v MAX = $ {СЕГОДНЯ} -F ["] "" [ "]«{если ($ 2> = MIN & & $ 2 < = МАКС) print $ 0} 'logfile.войти

+0

В конце концов я договорился, чтобы избежать фильтрации журналов и просто использовать резервные копии, созданные logrotate, вместо этого, но я протестировал этот ответ и, похоже, сработал. Огромное спасибо! –

0

Вы могли бы попробовать что-то вроде:

ВЧЕРА = $ (дата -d "вчера 00:00:00" + "% s")
СЕГОДНЯ = $ (дата -d «сегодня 00:00: 00 "+"% s ")
cat your_log | \
AWK -v MIN = $ {ВЧЕРА} -v MAX = $ {СЕГОДНЯ} {если ($ 1> = MIN & & $ 1 < MAX) печать} '

:)
Dale

0

Комбинируя советы и рекомендации от Гленн, Дейл, и Дэвисон:

awk -v today=$(date -d "today 00:00:00" +"%s") -v yesterday=$(date -d "yesterday 00:00:00" +"%s") -F'[\\[\\] ]' '{ if($2 >= yesterday && $2 < today) print }' logfile.log

использует замену $() команды командного интерпретатора, чтобы кормить переменные -v аргумента парсер AWK в
-F'[\\[\\] ]' устанавливает разделитель полей, чтобы быть [, ] или

входные данные:

[1300000000 log1 data1 entry1] 
[1444370000 log2 data2 entry2] 
[1444374000 log3 data3 entry3] 
[1444460399 log4 data4 entry4] 
[1500000000 log5 data5 entry5] 

выход:

[1444370000 log2 data2 entry2] 
Смежные вопросы