Получить последние датированные строки из списка

Получить последние датированные строки из списка

Если у меня есть входной файл со списком пользователей и датами их последнего входа в систему, как я могу с помощью sort | awkфункции выбрать строки за последнюю минуту?

Даты написаны в +%H:%M:%Sформате.

Пример:

George 12:00:15 
Max    12:01:03 
Kate   10:32:54 
Adam   08:21:47 
Andrea 12:00:10

Текущая дата12:01:04

Результаты функции if будут в 1-й, 2-й и 5-й строках.

решение1

С GNU dateи awk:

awk -F'[ :]+' -v l=$(date -d '1 minutes ago' "+%H:%M") -v c=$(date "+%H:%M") '
    $2":"$3==l || $2":"$3==c
' file
George 12:33:15 
Max    12:33:03 
Andrea 12:33:10

решение2

С помощью GNU awk:

awk 'BEGIN{t=strftime("%T",systime()-60)}$NF >= t'

решение3

В bashGNU и с его помощью date(по умолчанию в большинстве систем Linux) вы можете сделать следующее:

threshold=$(( $(date -d 12:01:04 +%s) - 60 ))
paste file <(awk '{ print $2 }' file | date -f - +%s) |
  awk '$3 > '"$threshold"' { print $1,$2 }'

Или сохранить форматирование, как в примере в вопросе:

threshold=$(( $(date -d 12:01:04 +%s) - 60 ))
paste file <(awk '{ print $2 }' file | date -f - +%s) |
  awk '$3 > '"$threshold" |
  cut -c 1-15

Выход:

George 12:00:15
Max    12:01:03
Andrea 12:00:10

Для реального примера вы также можете сделать дату «1 минуту назад» (согласно ответу Gnouc). Первая строка будет:

threshold=$(date -d '1 minute ago' +%s)

Связанный контент