Как вычислить эту разницу в unix

#shell #unix #awk

#оболочка #unix #awk

Вопрос:

У меня есть файл с именем Test1.dat, и его содержимое выглядит следующим образом

 Abcxxxxxxxxxxx_123.dat@10:10:15
Bcdxxxxxxxxxxx_145.dat@10:15:23
Cssxxxxxxxxxxx_567.dat@10:26:56
Fgsxxxxxxxxxxx_823.dat@10:46:56
Kssxxxxxxxxxxx_999.dat@11:15:23
  

Пожалуйста, обратите внимание, что после символа @ следует формат HH: MM:SS. Теперь мой вопрос заключается в том, что я хочу вычислить разницу во времени между текущим временем и временем, присутствующим в файлах, и извлекать только те имена файлов, где разница во времени составляет более 30 минут. Итак, если текущее время равно 11:00:00, я хочу получить файлы, которые поступили за 30 минут до этого, то есть в основном первые три файла.

Ответ №1:

Это awk должно сделать:

 awk -F@ '$2>=from amp;amp; $2<=to' from="$(date  %H:%M:%S -d -30min)" to="$(date  %H:%M:%S)" file
  

Если вам нужно получить только последние 30 минут (в вашем случае вам нужна первая, так как вам не нравится 11:30):

 awk -F@ '$2>=from' from="$(date  %H:%M:%S -d -30min)" file
  

Комментарии:

1. привет, как мне распечатать строки.?

2. @user2647888 Поскольку это awk относится только к тестовой части, а не к части действия, оно выполнит действие по умолчанию: {print $0} (выведите строку). Так что это awk должно сделать все.

Ответ №2:

Вы также можете использовать скрипт bash и получить результат

 #!/bin/bash
current=`date  ' %s'`
needed_time=`echo "$current - 60 * 30" | bc`
while read line ; do 
    time=`echo $line |sed -r 's/[^@]*.(.*)/1/g'` 
    user_time=`date -d $time ' %s'`
            if [ $user_time -le $needed_time ] ; then
            echo "$line"
    fi
done < file_name    
  

Ответ №3:

Может ли это быть ответом?

 awk -F@ '{ts = systime(); thirty_mins = 30 * 60; thirty_mins_ago = ts - thirty_mins;  if ($2 < strftime("%H:%M:%S", thirty_mins_ago)) print $2 }' <file.txt
  

strftime является расширением GAWK (gnu awk).

Комментарии:

1. strftime является gnu awk расширением, поэтому вы должны добавить эту информацию.

2. Конечно, теперь я вижу, чтобы обновить свой пост с информацией о вас.