печать, если метка времени больше минуты

печать, если метка времени больше минуты

03.02.2020 09:37:04 Просмотров 2 Источник

У меня есть строки ввода, содержащие 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

oguz ismail

03.02.2020 09:40:50

Предполагая, что ваш файл разделен пробелом / табуляцией, это должно сделать трюк:

awk '$7!~/^(00:01:00|00:00)/{print $2,$7,$8}' file > out_file
Является ответом!
RavinderSingh13

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
https://stackoverflow.com/questions/60034193/print-if-timestamp-is-greater-than-a-minute/60034300#comment106172971_60034300
я ввел свой ввод в эту команду awk, и она, казалось, работала, только ничего не печаталось на экране терминала, и я ожидал, по крайней мере, пару распечаток. спасибо, это помогло мне понять немного больше, что может сделать awk.
https://stackoverflow.com/questions/60034193/print-if-timestamp-is-greater-than-a-minute/60034300#comment106173043_60034300
@JayWehrman, я только что добавил тестовый образец с работающим кодом и, похоже, он отлично работал для меня, не могли бы вы дать мне знать, что именно здесь не сработало?
https://stackoverflow.com/questions/60034193/print-if-timestamp-is-greater-than-a-minute/60034300#comment106173184_60034300
хм, Так что это работает, когда я создаю свой собственный входной файл и даю его awk, но когда я пытаюсь передать echo ps-ef в тот же сценарий awk, файл, в который я пишу результаты awks, пуст.
https://stackoverflow.com/questions/60034193/print-if-timestamp-is-greater-than-a-minute/60034300#comment106173242_60034300
@JayWehrman, я добавил решение EDIT1, не могли бы вы проверить его и дать мне знать, если это поможет вам?
https://stackoverflow.com/questions/60034193/print-if-timestamp-is-greater-than-a-minute/60034300#comment106173313_60034300
спасибо большое, что сработало! У меня было echoдо psВ моем сценарии bash!
tshiono

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.

Allan

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предназначена для красивого вывода, может быть удалена.
Закрыть X