Grepping длятся журнал 5 минут

Я должен к grep продержаться журнал 5 минут. файл журнала:

18-06-17 06:00:09 ID-5
18-06-17 06:00:11 ID-78
20-06-17 09:34:51 ID-Hello
21-06-17 09:20:49 link is down
22-06-17 06:00:11 ID-674
22-06-17 06:40:51 ID-2
22-06-17 06:40:55 ID-7
22-06-17 06:40:16 ID-3
22-06-17 06:42:20 ID-2

date +"%d-%m-%y %k:%M:%S"
22-06-17 06:43:40

Я попробовал:

awk -v date=$(date -d "30 minutes ago" +"%d-%m-%y %k:%M:%S") '$1" "$2 >= date { print $0 }' log

но имейте ошибку:

awk: cmd. line:1: 06:43:40
awk: cmd. line-1-   ^ syntax error

Можно ли помочь мне с этой проблемой?

1
задан 22 June 2017 в 11:31

2 ответа

Если бы Ваша дата/время была структурирована yy-mm-dd hh:mm:ss вместо дня сначала, то Вы могли выполнить сравнения строк для фильтрации на строках после данной даты. Для переформатирования использования данных

sed 's/\(..\)-\(..\)-\(..\)\(.*\)/\3-\2-\1\4/' log > log.reformatted

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

awk '$1 " " $2 >= "17-06-22 06:40:00"' log.reformatted

использование даты для получения времени 30 минут назад хорошо - просто изменяют его, чтобы быть в формате дня месяца года. Вам не нужно действие печати за 0$, так как это подразумевается, если никакое действие не указано.

Примечание, что я предполагаю, что "grepping" предназначается, чтобы означать использовать инструменты Unix для фильтрации для желаемого подмножества доступных данных.

исходная ошибка происходит, вероятно, из-за пространства между датой и временем так, чтобы -v аргумент только получил дату, в то время как время появляется как отдельный аргумент, путая awk. Для разрешения этого использования %H формат, а не %k (так как формат журнала составляет два часа цифры так или иначе), и удаляют пространство между днем и часом (как упрощенное решение проблемы). Затем целое решение становится:

sed 's/\(..\)-\(..\)-\(..\)\(.*\)/\3-\2-\1\4/' log |
awk -v date=$(date -d "30 minutes ago" +"%y-%m-%d%H:%M:%S") '$1$2 >= date'
0
ответ дан 8 December 2019 в 04:55

Все в одном awk команда, совместимая с gawk, mawk, и POSIX awk спецификация:

$ awk -F '[- ]' -v target="$(date -d '30 minutes ago' +'%y-%m-%d %T')" '
    { time = sprintf("%02d-%02d-%02d %s", $3, $2, $1, $4) }
    time >= target
  ' log

Во-первых, я вызываю awk способом, который принимает дефис и пространство как разделители, которое делает для более простого парсинга даты. awk командная строка также звонит date определить a time переменная в формате yy-mm-dd HH:MM:SS (от старшей значащей единицы до наименьшего так, чтобы это могло быть отсортировано).

Первая строка в awk использует тот же самый формат времени для установки time переменная для каждой строки журнала. Вторая строка затем asciibetically сравнивает время строки журнала с целевым временем. awkдействие по умолчанию должно распечатать, таким образом, оно печатает строку.

Используя "30 минут назад" относительно "22.06.17 6:43:40 вопроса":

$ awk -F '[- ]' -v target="$(date -d '2017-06-22 06:13:40' +'%y-%m-%d %T')" '
    { time = sprintf("%02d-%02d-%02d %s", $3, $2, $1, $4) }
    time >= target
  ' log

22-06-17 06:40:51 ID-2
22-06-17 06:40:55 ID-7
22-06-17 06:40:16 ID-3
22-06-17 06:42:20 ID-2
0
ответ дан 8 December 2019 в 04:55

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

Похожие вопросы: