Виникла задача — витягти з лога FreeRadius’а (той, який detail-YYYYMMDD
) всі записи, що стосуються певного клієнта: дзвінків на номер (чи з номера) XXXYYZ[0-2] (з певним Called-
чи Calling-Station-Id
). Вхопився за Python, але, не встигши набрати #!/usr/bin/python
, вирішив зробити це з допомогою awk.
Хто не знає — лог FreeRadius’а містить «секції», відділені порожніми рядками. Кожна секція — якась кількість рядків, серед них є Calling-Station-Id = <номер>
(чи Called-Station-Id
), і мене цікавлять саме секції щодо дзвінків з певних номерів (чи на певні номери).
Отже, «п’ятихвилинний» робочий скрипт:
# # cutlog.awk : # BEGIN { # flag to indicate "good" set of lines: good = 0 # counters: selected = 0 total = 0 } { # add line to set: set = set $0 "\n" # if wanted condition occur, flag set as good: if ($0 ~ pattern) { good = 1 } # if empty line... if (!length) { # print set if it is "good": if (good) { printf ("%s", set) selected += 1 } total += 1 # start to work again: good = 0 set = "" } } END { printf("%i records (%i lines) processed\n", total, NR) > "/dev/stderr" printf("%i records matched\n", selected) > "/dev/stderr" printf("Pattern was: '%s'\n\n", pattern) > "/dev/stderr" } |
Тепер можна виколупати шматок лога з потрібними записами:
awk -f cutlog.awk pattern='Station-Id = \"XXXXYYZ[0-2]\"' detail-YYYYMMDD > detail-YYYYMMDD.part |
UPDATE: Python is better ;-)