Сценарий уже записывает выходные данные в файл с именем «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.
Спасибо
В файле журнала есть время и дата, но в нем также много ненужной информации, которую мне нужно отфильтровать.
awk был специально создан для фильтрации текста, так что это, вероятно, тривиально. Гораздо эффективнее распечатать временные метки, уже имеющиеся в вашем файле журнала, чем создавать их для каждой строки вывода, особенно если у вас нет GNU awk.
Значит, отфильтровать ненужный текст будет проще, чем добавить системную функцию AWK?
idk о проще, но я ожидаю, что это будет более эффективно. Я ожидаю, что это будет абсолютно тривиально, но пока я не увижу образец вашего idk файла журнала, чтобы точно знать, какая дополнительная работа связана с этим. У вас есть GNU awk? Это единственный с функцией systime().
Если я чего-то не понимаю в вашем окружении...
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
}
}
'
Есть ли в файле журнала, который вы отслеживаете, временные метки, когда происходят
disconnect_tcp_conn
иdaemon apps started
? Если это так, покажите этот раздел файла журнала в вашем вопросе.