LINUX.ORG.RU

RegExp - помогите с awk - надо отфильтровать после sort список адресов по времени соединения..

 , , , ,


0

1

Привет! Отсортировал логи по времени и мак адресам, список получился внушительный. По времени первая колонка сортирует заходы по mac адресам сверху вниз (ну как надо в общем). Хочу оставить только время захода и время последнего соединения. Выглядит это так:

grep 'subscribe' sml.log |awk -F/ '{print $1 $2 $3 "Mac: " $5}' | sed 's/.*\[//; s/+0300\]."GET//; /HTTP/d' | sort -k2

16Aug2018:18:12:10 Mac: 00:02:9B:A0:35:5C
16Aug2018:18:12:20 Mac: 00:02:9B:A0:35:5C
16Aug2018:18:12:30 Mac: 00:02:9B:A0:35:5C
16Aug2018:18:12:40 Mac: 00:02:9B:A0:35:5C
16Aug2018:18:12:50 Mac: 00:02:9B:A0:35:5C
16Aug2018:18:13:01 Mac: 00:02:9B:A0:35:5C
16Aug2018:18:13:11 Mac: 00:02:9B:A0:35:5C
16Aug2018:18:13:21 Mac: 00:02:9B:A0:35:5C
16Aug2018:06:27:26 Mac: 00:02:9B:A0:36:25
16Aug2018:06:27:37 Mac: 00:02:9B:A0:36:25
16Aug2018:06:27:48 Mac: 00:02:9B:A0:36:25
16Aug2018:06:27:58 Mac: 00:02:9B:A0:36:25
Пытаюсь фильтровать с помощью awk (дописываю после пайпы):

awk '!($2 in a) {if (a[$2] == a[$2]++)a[$2]--; print;  a[$2]; print ; a[$2]++; print; print "===="}'

но фигня какая-то..
====
16Aug2018:06:27:34 E4:27:71:70:42:42
16Aug2018:06:27:34 E4:27:71:70:42:42
16Aug2018:06:27:34 E4:27:71:70:42:42
====
16Aug2018:06:27:26 F4:27:71:1F:09:FF
16Aug2018:06:27:26 F4:27:71:1F:09:FF
16Aug2018:06:27:26 F4:27:71:1F:09:FF
====
одинаковые первые строки пишет, тоже самое что и print $0 в awk. Посоветуйте как правильно решить по логике, что -то не так делаю явно!

Хочу оставить только время захода и время последнего соединения
Aug

тогда уж лучше сначала в epoch перевести, гнутый awk умеет

1534787028.47 5
1534787029.48 1
1534787030.49 4
1534787031.50 2
1534787032.51 1
1534787033.52 5
1534787034.53 4
1534787035.54 2
1534787036.55 3
1534787037.56 3
awk '$1 > ts[$2] { ts[$2] = $1; str[$2] = $0 } END { for (mac in str) print str[mac]}' | sort
1534787032.51 1
1534787033.52 5
1534787034.53 4
1534787035.54 2
1534787037.56 3
anonymous ()
Ответ на: комментарий от anonymous

В данном случае один мак вывел. Я пытался сравнением строк вывести, сравнивая каждую строчку с последующей и если есть разница, то печать обеих строк. Но у меня печатает одну и ту же. Честно говоря не понимаю почему. Может в отдельный массив сбрасывать каждую строку мак адреса с временем, сортировать печатать только первый и последний? (но по моему громоздко получится по командам)? Это давно где-то должно быть решено и наверняка «гениально и просто»..

kaurych ()
Ответ на: комментарий от kaurych

Я же сразу сказал, что это заготовка, накиданная на коленке за пару секунд, я даже ничего не проверял. Просто посмотри, твой кошмар с пайпами обрабатывается одним только awk у меня в примере, и пляши оттуда. Разобраться — пять минут делов, а я уже достаточно упоролся, чтобы быть не в состоянии решать насущные задачи.

r3lgar ★★★★★ ()
Ответ на: комментарий от r3lgar

Сделал:

awk -F/ '/subscribe/{gsub(/.*\[|+0300\].\«GET|HTTP/, »"); print $1 $2 $3 $5}' sml.log | head -500000 | sort -k2

но сортировку выводит только когда head передаю поток, иначе виснит не понятно на сколько.

kaurych ()
Ответ на: комментарий от r3lgar

Уточню, конечный вывод вот такой надо увидеть:
====
16Aug2018:06:27:34 E4:27:71:70:42:42
17Aug2018:10:50:53 E4:27:71:70:42:42
====
16Aug2018:06:27:26 F4:27:71:1F:09:FF
17Aug2018:10:50:47 F4:27:71:1F:09:FF
====

На время и дату обратите внимание, они разные;
====
1 - самое первое подключение
2 - последнее подключение
====

Т.е тут из сортировки надо выдернуть на вывод первую строку с каждым мак адресом и последнюю. И так по каждому маку..

kaurych ()