Добавить отметку времени к записям журнала, созданным из сценария AWK

Сценарий уже записывает выходные данные в файл с именем «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 [email protected] </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.

Спасибо

Есть ли в файле журнала, который вы отслеживаете, временные метки, когда происходят disconnect_tcp_conn и daemon apps started? Если это так, покажите этот раздел файла журнала в вашем вопросе.

Ed Morton 18.05.2019 01:13

В файле журнала есть время и дата, но в нем также много ненужной информации, которую мне нужно отфильтровать.

Sceptersax 18.05.2019 01:22

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

Ed Morton 18.05.2019 01:24

Значит, отфильтровать ненужный текст будет проще, чем добавить системную функцию AWK?

Sceptersax 18.05.2019 01:41

idk о проще, но я ожидаю, что это будет более эффективно. Я ожидаю, что это будет абсолютно тривиально, но пока я не увижу образец вашего idk файла журнала, чтобы точно знать, какая дополнительная работа связана с этим. У вас есть GNU awk? Это единственный с функцией systime().

Ed Morton 18.05.2019 01:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
1 072
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если я чего-то не понимаю в вашем окружении...

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

а также

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

Видеть: https://www.tutorialspoint.com/awk/awk_time_functions.htm для деталей.

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

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

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

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

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

Ответ принят как подходящий

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

ПИСТОЛЕТ ОК:

$ 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

Поместите код туда, где вам нужно сгенерировать временную метку, я просто разместил его в разделе НАЧАЛО, чтобы продемонстрировать, как написать код для создания временной метки и сохранения ее в переменной.

Я знаю, что были и другие ответы, но на случай, если кто-то захочет узнать, что я в итоге использовал и работал для своей цели... вот оно:

 msg = "%m/%d/%Y %H:%M:%S 

print strftime(msg) | "tee -a

В итоге я использовал GAWK вместо AWK.

Это позволило мне иметь время и дату в файле журнала в GAWK.

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

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

    function report(curr_state,    msg) {
        if ( prev_state != curr_state ) {
            msg = "%m/%d/%Y %H:%M:%S "Server is " curr_state
            system("mail -s \047" strftime(msg) "\047 [email protected] </dev/null")
            # print msg | "cat>&2"
            print strftime(msg) | "tee -a \047/var/log/server_mon.txt\047 >&2"
            prev_state = curr_state
        }
    }
'

Другие вопросы по теме