リストから直前の日付の行を取得する

リストから直前の日付の行を取得する

ユーザーのリストと最後にサインインした日付を含む入力ファイルがある場合、関数を使用してsort | awk最後の 1 分間の行を選択するにはどうすればよいですか?

日付は+%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 dateawk:

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 (ほとんどの Linux システムではデフォルト) を使用すると、date次の操作を実行できます。

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)

関連情報