печать, если метка времени больше минуты
У меня есть строки ввода, содержащие 8 полей. Вот так:
Field1 Field2 Field3 Field4 Field5 Field6 Field7 Field8
name ID number stuff Jan15 ? 00:00:00 some command
Одно из полей, Field7, является меткой времени, такой как 00:00:00
Я хотел бы "сканировать" это 7-е поле и посмотреть, если время больше одной минуты, то есть если 7-е поле больше 00:01:00.
Если 7-е поле больше, то я хотел бы распечатать значения полей 2 7 и 8 в файл. У меня очень мало опыта работы с awk, но из того, что я понимаю, это инструмент, который я хочу использовать.

Ответы - печать, если метка времени больше минуты / print if timestamp is greater than a minute

03.02.2020 09:40:50
Предполагая, что ваш файл разделен пробелом / табуляцией, это должно сделать трюк:
awk '$7!~/^(00:01:00|00:00)/{print $2,$7,$8}' file > out_file

03.02.2020 09:45:01
EDIT1: чтобы запустить его с ps
Также, чтобы покрыть 1 крайний случай, где процесс работает в течение точного 1 часа и меньше минуты:) попробуйте следующее.
ps -ef | awk '
{
split($7,array,":")
tot_time=array[2]*60+array[3]
if(tot_time>60){
print $2,$7,$8
}
tot_time=""
delete array
}
'
Не могли бы вы, пожалуйста, попробовать следовать. Разбиение 7-го столбца на 3 разных части (часы, минуты и секунды) с разделителем as ps -ef | awk '
{
split($7,array,":")
tot_time=array[1]*3600+array[2]*60+array[3]
if(tot_time>60){
print $2,$7,$8
}
tot_time=""
delete array
}
'
и затем вычисление минут из него, чтобы проверить, является ли его значение больше 60 или нет.
:
Испытания с образцами:
awk '
{
split($7,array,":")
tot_time=array[2]*60+array[3]
if(tot_time>60){
print $2,$7,$8
}
tot_time=""
delete array
}
' Input_file
После запуска кода следующий будет вывод.
cat Input_file
Field1 Field2 Field3 Field4 Field5 Field6 Field7 Field8
xxx xxx xxx xxx xxx xxx 00:01:01 xxx
xxx xxx xxx xxx xxx xxx 00:00:48 xxx






03.02.2020 10:14:34
Предположим, что поля разделены пробелами или табуляциями, как насчет:
awk '$7 > "00:01:00" {print $2, $7, $8}' file
входные данные:
name1 ID1 number1 stuff Jan15 ? 00:00:59 somecommand1
name2 ID2 number2 stuff Jan15 ? 00:01:00 somecommand2
name3 ID3 number3 stuff Jan15 ? 00:01:01 somecommand3
name4 ID4 number3 stuff Jan15 ? 00:02:00 somecommand4
выход:
ID3 00:01:01 somecommand3
ID4 00:02:00 somecommand4
Awk в первую очередь сравнивает две строки как strings
, если только обе не являются числовыми
значения или один из них является числовым, а другой-числовой строкой.
В этом случае string comparison
строк выполняется, то вы можете непосредственно
сравните временные строки в представлении HH:MM:SS.

03.02.2020 10:44:03
Если у вас есть следующий входной файл:
Field1 Field2 Field3 Field4 Field5 Field6 Field7 Field8
name ID number stuff Jan15 ? 00:00:14 somecommand
name2 ID2 number2 stuff Jan15 ? 00:00:30 somecommand2
name3 ID3 number3 stuff Jan15 ? 00:01:30 somecommand3
name4 ID4 number4 stuff Jan15 ? 01:01:30 somecommand4
name5 ID5 number5 stuff Jan15 ? 01:00:00 somecommand5
name6 ID6 number6 stuff Jan15 ? 00:01:00 somecommand5
Вы можете использовать следующую awk
Это даст выход:
awk '$7 !~ /(^00:00|00:01:00)/ || NR==1 {print $2,$7,$8}' f.in | column -t
Объяснения:
- Подход, основанный на регулярном выражении
Field2 Field7 Field8 ID3 00:01:30 somecommand3 ID4 01:01:30 somecommand4 ID5 01:00:00 somecommand5
для печати первой строки (вы можете удалить эту часть, если нет необходимости)- Паттерн не начинается с
NR==1
или не равен00:00
, это может быть удалено, если вы измените ограничение на большее или равное 1 минуте - печать обязательных полей
00:01:00
предназначена для красивого вывода, может быть удалена.