Я должен к 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
Можно ли помочь мне с этой проблемой?
Если бы Ваша дата/время была структурирована 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'
Все в одном 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