2016-06-20 6 views
1

У меня есть файл журнала, как это: (example.log)чтения журналов на основе текущего времени Stamp

2016-06-13 04:50:10.327 39571893 [Thread-39-a-b-c-bolt] INFO JobLoader c.t.c.i.i.b.abcBolt - Setting other variation theme 
2016-06-13 04:50:10.327 39571893 [Thread-39-a-b-c-bolt] INFO JobLoader c.t.c.i.i.b.abcBolt - Stripping abc hierarchy 
2016-06-13 04:50:10.328 39571894 [Thread-39-a-b-c-bolt] INFO JobLoader c.t.c.i.i.b.abcBolt - Transforming date attributes 
2016-06-13 04:50:10.328 39571894 [Thread-39-a-b-c-bolt] INFO JobLoader c.t.c.i.i.b.abcBolt - Creating API object for incoming data 

Теперь я только хочу, чтобы читать журналы последних 4 часа (не последние 4 часа от последнего журнала но последние 4 часа от текущего системного времени, может быть 0 журналов, но затем должен быть создан пустой файл) и хранить журналы (в точности без изменений) в отдельном файле. Могу ли я просто сравнить временную метку, или мне нужно извлечь час, минуту и ​​секунду и применить логику?

Моя попытка:

x=$((4*3600)) 
current = date 
awk -F 'JobLoader' -v current=$current -v x=$x '{ ______ | getline d; if (current-d<=x)print $0 }' example.log > output.txt 

У меня возникли проблемы о том, как Grep текущее время текущего журнала и является ли я могу сравнить, как я сделал?

Фактически у меня есть непрерывная операция с журналами, чтобы сделать i.e извлечение 16-го и 20-го полей в отдельный файл. Я делаю это на основе предложений:

awk ' { 
    cutoff=$(date -d "now -4 hours" +%s) 
    date=$(cut -c1-19 <<<"$line") 
    ts=$(date -d "$date" +%s) 
    if [ $cutoff -le $ts ]; then 
     print $3 
    fi  
} ' /home/example.log >> output.txt 

Но я получаю сообщение об ошибке, как:

awk: cmd. line:2:  cutoff=$(date -d "now -4 hours" +%s) 
awk: cmd. line:2:         ^syntax error 
awk: cmd. line:3:  date=$(cut -c1-19 <<<"$line") 
awk: cmd. line:3:      ^syntax error 
awk: cmd. line:4:  ts=$(date -d "$date" +%s) 
awk: cmd. line:4:       ^syntax error 
awk: cmd. line:5:  if [ $cutoff -le $ts ]; then 
awk: cmd. line:5:      ^syntax error 

Что я делаю неправильно здесь? Пожалуйста, предложите решение, основанное только на awk. Я не могу использовать sed и т. Д.

+0

У вас есть попытки решить проблему? Это поможет определить необходимость в контексте и предложить, какие инструменты вы хотите использовать ('awk',' grep' и т. Д.). – bishop

+0

@bishop: Я пробовал выше. Но как сказал, не получив, чтобы заполнить там? –

+1

Будет ли каждая строка начинаться с даты, или у вас есть стек или другой многострочный вывод? –

ответ

1

Существует несколько способов решить эту проблему: awk и perl весной. Лично я, как только чистый раствор Баш:

cutoff=$(date -d "now -4 hours" +%s) 
while read line; do 
    date=$(cut -c1-19 <<<"$line") 
    ts=$(date -d "$date" +%s) 
    if [ $cutoff -le $ts ]; then 
     echo "$line" 
    else 
     break 
    fi 
done < <(tac $1) 

Вот что происходит:

  • Первая линия, мы устанавливаем время обрезания в качестве метки времени UNIX (%s), что четыре часа в прошлом текущего сигнала (now -4 hours)
  • Тогда для каждой строки в данном файле, чтение из последней строки к первой (tac $1)
  • Мы Ĉ ut out часть даты, которая является первым 20 символами (-c1-19), затем преобразует ее в отметку времени UNIX (-d "$date")
  • Затем мы сравниваем временную метку строки журнала с отсечкой: если длина строки журнала больше, чем обрезание , мы печатаем линию. Если нет, мы закончим цикл.

Конечно, это предполагает, что ваши файлы журналов монотонно увеличиваются и каждая строка начинается с даты. Также у вас есть доступ к дате GNU и tac. Если вам нужна большая мобильность, awk - это путь. Если вам нужен скрипт с отступом, я бы использовал bash.

+0

Спасибо за ответ. Но просто хочу знать, как мы можем это сделать, если хотим сделать это с помощью awk, например, что я пытался. –

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