Добавить метку времени к записям журнала, сгенерированным из скрипта AWK - PullRequest
0 голосов
/ 18 мая 2019

Сценарий уже записывает выходные данные в файл с именем "server_mon.txt. Я хотел бы добавить метку времени к каждой записи с целью отслеживания активности сервера.

Теперь я понимаю, что стандартный AWK не 'У меня нет встроенной функции времени / даты, которую можно легко присвоить переменной. Я попытался сделать следующее, но у меня ничего не вышло:

tail -fn0 /var/log/user | /usr/bin/awk '
BEGIN {
    str = "date +%Y-%m-%d";
    str = | getline date;
    close str;

Ниже приведен мой полный сценарий:

#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

tail -fn0 /var/log/user | /usr/bin/awk '
    /disconnect_tcp_conn/ { report("down") }
    /daemon apps started/  { report("up") }

    function report(curr_state,    msg) {
        if ( prev_state != curr_state ) {
            msg = "Server is " curr_state
            system("mail -s \047" msg "\047 mail@gmail.com </dev/null")
            print msg | "cat>&2"
            prev_state = curr_state
        }
    }
'

 &
PID=$!

DIEAT=`expr $SECONDS + 58`
while [ -d /proc/$PID ] && [ "$SECONDS" -lt "$DIEAT" ]
do
        sleep 1
done

[ -d /proc/$PID ] && kill "$PID"
wait

Ожидайте увидеть метку времени, связанную с каждой записью журнала в server_mon.txt.

Спасибо

Ответы [ 3 ]

1 голос
/ 18 мая 2019

Я настоятельно рекомендую просто прочитать и распечатать временные интервалы, уже присутствующие в вашем файле журнала, но если это не вариант для некоторого резонанса, то вот вам выбор:

GUN awk:

$ awk 'BEGIN{ timestamp = strftime("%F %T"); print timestamp }'
2019-05-17 18:40:56

Любой awk (намного менее эффективный из-за появления оболочки для каждого вызова date):

$ awk 'BEGIN{ cmd="date \"+%F %T\""; timestamp=( (cmd | getline line) > 0 ? line : "N/A"); print timestamp }'
2019-05-17 18:40:59

Поместите код в то место, где вам нужно сгенерировать метку времени, я просто поместил его в раздел BEGIN, чтобы продемонстрировать, как написать код для генерации метки времени и сохранить его в переменной.

0 голосов
/ 18 мая 2019

Предполагая, что каждая строка в файле журнала является записью в журнале.

Если вы хотите добавить метку времени к каждой строке в файле. Это скрипт awk:

awk '{ print(strftime(), $0); }' input.txt

Чтобы узнать больше о времени awk и функциях данных, прочитайте документацию здесь .

strftime() Функция может быть настроена на ваш формат даты / времени с параметрами.

0 голосов
/ 18 мая 2019

Если я ничего не понимаю в вашей среде ...

systime () возвращает секунды с 1 января 1970 года

и

mktime (datepec) и strftime ([format [, timestamp [, utc-flag]]])) преобразуют эту временную метку в полезные строки.

См: https://www.tutorialspoint.com/awk/awk_time_functions.htm для деталей.

...