Видобування шматка лога FreeRadius

Posted on

Виникла задача — витягти з лога 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) &gt; "/dev/stderr"
    printf("%i records matched\n", selected) &gt; "/dev/stderr"
    printf("Pattern was: '%s'\n\n", pattern) &gt; "/dev/stderr"
}

Тепер можна виколупати шматок лога з потрібними записами:

awk -f cutlog.awk pattern='Station-Id = \"XXXXYYZ[0-2]\"' detail-YYYYMMDD > detail-YYYYMMDD.part

UPDATE: Python is better ;-)

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.