Использование awk для получения последней метки Timsstamp из файла в скрипте Bash - PullRequest
0 голосов
/ 19 марта 2019

Я долго искал и обнаружил, что вы не можете направить вывод syslog как в буфер, так и в файл через syslog-startup.conf в / etc.Пожалуйста, посмотрите это: https://unix.stackexchange.com/questions/449156/how-to-set-up-syslog-to-log-to-both-file-buffer

Мое решение состояло в том, чтобы иметь задачу cron, запускающую скрипт bash, который будет запускаться каждые пару минут, чтобы захватить журналы из буфера и сохранить их в файл на моем встроенном устройстве Linux.,Подход заключается в том, что я получаю первый набор журналов из буфера, выполняя что-то вроде logread >> my_log_file, а затем я беру последнюю запись из my_log_file, получаю из нее метку времени, а затем использую ее для получения новых журналов, которые имеют метку времени больше, чемthis timestamp.

Я сталкиваюсь с проблемой, пытающейся подключить timstamp к команде awk

if [ -f "${VAR_FILE}" ]; then
    LASTTS=$(tail -n 1 "${VAR_FILE}" | grep -o '^.*swi-')
    LASTTS=$(sed 's/.\{5\}$//' <<< "$LASTTS")
    echo $LASTTS
fi

awk '$0 > "${LASTTS}"' msgs >> "${VAR_FILE}"

Я продолжаю получать все журналы, а не те, что> моя последняя отметка времени.Это работает, если я изменяю команду awk, чтобы фактическая дата была жестко запрограммирована как таковая

awk '$0 > "Mar 15 14:20:50"' msgs >> "${VAR_FILE}"

Что я делаю неправильно?

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Существует три случая:

  1. ничего еще не сохранено в файл
  2. буфер имеет новое содержимое, а некоторое старое содержимое
  3. буфер только новое содержимое (мы пропустиличто-то)

Мы хотим добавить только новый контент из буфера.

Предполагая awk и оболочку busybox:

#!/bin/sh

if [ ! -f "$log" ]; then
    # case 1
    logread > "$log"
else
    prev="$(tail -n 1 "$log")"

    # case 2 or 3
    logread | awk -v prev="$prev" '
        new { print; next }
        $0==prev { new=1 }
        END { exit !new } # "fail" if no old line
    ' >> "$log" 

    # case 3
    [ -n $? ] && logread >> "$log"
fi
0 голосов
/ 19 марта 2019

ТАК, что я искал ответ:

awk -v var="$LASTTS" '$0 > var' msgs >> "${VAR_FILE}"

Это имеет тенденцию решать проблему, с которой я столкнулся.Но теперь я столкнулся с тем фактом, что он всегда дублирует последнюю метку времени, которая копируется повторно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...