Как получить данные за прошедший час, 6 часов, 24 часа из файла журнала CSV с помощью awk, sed или другого? - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть файл журнала csv в следующем формате. Я не очень хорош в awk / sed. Кто-нибудь скажет мне, как извлечь данные за прошедший час, 6 часов и 24 часа.

Это формат моего журнала:

blabla,11:04:44,Alarm,121,TBD,TBD
blabla,11:04:50,Alarm,121,TBD,00:00:05
blabla,11:04:54,Warning,121,00:00:09,00:00:05
blabla,11:06:12,Alarm,125,TBD,TBD
blabla,11:06:42,Alarm,125,TBD,00:00:29
blabla,16:06:55,Warning,125,00:00:41,00:00:29
blabla,16:09:13,Alarm,125,TBD,TBD
blabla,16:10:32,Alarm,125,TBD,TBD
blabla,16:14:50,Alarm,125,TBD,TBD
blabla,16:15:00,Normal,125,00:00:10,TBD
blabla,16:15:03,Normal,125,00:00:10,00:00:13
blabla,20:04:08,Alarm,121,TBD,TBD
blabla,20:04:21,Normal,121,00:00:13,TBD
blabla,20:04:25,Normal,121,00:00:13,00:00:16
blabla,20:06:12,Alarm,125,TBD,TBD

Итак, предполагая, что время сейчас 21:00 : 00, и мне нужны данные за прошедший час, вывод будет:

blabla,20:04:08,Alarm,121,TBD,TBD
blabla,20:04:21,Normal,121,00:00:13,TBD
blabla,20:04:25,Normal,121,00:00:13,00:00:16
blabla,20:06:12,Alarm,125,TBD,TBD

Для последних 6 ч вывод должен быть:

blabla,16:06:55,Warning,125,00:00:41,00:00:29
blabla,16:09:13,Alarm,125,TBD,TBD
blabla,16:10:32,Alarm,125,TBD,TBD
blabla,16:14:50,Alarm,125,TBD,TBD
blabla,16:15:00,Normal,125,00:00:10,TBD
blabla,16:15:03,Normal,125,00:00:10,00:00:13
blabla,20:04:08,Alarm,121,TBD,TBD
blabla,20:04:21,Normal,121,00:00:13,TBD
blabla,20:04:25,Normal,121,00:00:13,00:00:16
blabla,20:06:12,Alarm,125,TBD,TBD

Et c.

Я пытался придумать что-то самостоятельно, просто посмотрев на другие ответы, но, похоже, ничего не получилось с этими:

awk '$0>=from && $0<=to' from="$(date +"%H:%M:%S -d '1 hour ago'")" to="$(date +"%H:%M:%S")" logfile.csv (this actually produces error unexpected EOF while looking for matching)

и

sed -n "/^[^,]*,[^$(date --date='24 hours ago' '+%H:%M:%S'),],[^,]*,[^,]*,[^,]*,[^,]*/,\$p" logfile.csv

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Ваша попытка AWK уже близка:

$ awk  -F, '$2 >= from' from=$(date -d "6 hours ago" +%H:%M:%S) sample.txt

blabla,20:04:08,Alarm,121,TBD,TBD
blabla,20:04:21,Normal,121,00:00:13,TBD
blabla,20:04:25,Normal,121,00:00:13,00:00:16
blabla,20:06:12,Alarm,125,TBD,TBD

Вам нужно использовать -F,, чтобы сообщить awk о делении на ,. Это использует преимущество, что даже если они являются строками "20:04:08"> "20:00:00". Однако для других форматов вам может понадобиться математика.

Я не думаю, что sed будет работать, он не может сравнивать строки, и у вас, вероятно, не будет точного соответствия в журнале. Если вы знаете, что время существует в файле, оно тривиально:

sed -n '/20:04:08/,$p' sample.txt
blabla,20:04:08,Alarm,121,TBD,TBD
blabla,20:04:21,Normal,121,00:00:13,TBD
blabla,20:04:25,Normal,121,00:00:13,00:00:16
blabla,20:06:12,Alarm,125,TBD,TBD
0 голосов
/ 24 февраля 2020

Используя Миллера (https://github.com/johnkerl/miller) и запустив

mlr --csv -N put '$sourcetime=$2' \
then nest --explode --values --across-fields --nested-fs ":" -f 2 \
then put '$seconds=$2_1*3600+$2_2*60+$2_3' \
then filter '(21*3600-$seconds)<3600'  \
then cut -x -r -f '(_|sec)' input

у вас будет

+--------+--------+-----+----------+----------+------------+
| blabla | Alarm  | 121 | TBD      | TBD      | 20:04:08   |
| blabla | Normal | 121 | 00:00:13 | TBD      | 20:04:21   |
| blabla | Normal | 121 | 00:00:13 | 00:00:16 | 20:04:25   |
| blabla | Alarm  | 125 | TBD      | TBD      | 20:06:12   |
+--------+--------+-----+----------+----------+------------+
  • Я пересчитал время в секундах ( $seconds=$2_1*3600+$2_2*60+$2_3);
  • и отфильтрованные, начиная с 21:00:00 (в секундах это 21 * 3600), все записи последнего часа (в секундах это 3600), используя '(21*3600-$seconds)<3600'.

Вы можете изменить параметры фильтра по своему усмотрению

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...