#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. Конечно, теперь я вижу, чтобы обновить свой пост с информацией о вас.