LINUX.ORG.RU

Как распарсить кеш bind

 ,


0

2

Кусок кеша:

...
lorquotes.ru.           293097  NS      ns1.nameself.com.
                        293097  NS      ns2.nameself.com.
minjust.ru.             33751   A       87.245.163.3
www.msu.ru.             50600   A       188.44.50.103
nemi-comics.ru.         33889   A       188.93.212.26
nigma.ru.               40886   NS      ns8.nigma.ru.
                        40886   NS      ns3.nigma.ru.
                        40886   NS      mainns.nigma.ru.
                        40886   NS      ns4.nigma.ru.
mainns.nigma.ru.        40886   A       195.239.16.62
ns3.nigma.ru.           40886   A       195.239.178.238
ns4.nigma.ru.           40886   A       195.239.16.45
ns8.nigma.ru.           40886   A       46.182.31.138
ns2.rambler.ru.         9531    A       81.19.66.61
ns5.rambler.ru.         21239   A       81.19.67.90
www.xf-russia.ru.       31198   A       37.59.98.13
ya.ru.                  664     NS      ns2.yandex.ru.
                        664     NS      ns1.yandex.ru.
                        664     A       93.158.134.3
                        664     A       213.180.204.3
                        664     A       213.180.193.3
ns.yadro.ru.            9784    A       88.212.202.56
ns1.yandex.ru.          27312   A       213.180.193.1
                        1777    AAAA    2a02:6b8::1
ns2.yandex.ru.          105     A       93.158.134.1
                        1777    AAAA    2a02:6b8:0:1::1
ns3.yandex.ru.          2152    A       87.250.250.1
                        2617    AAAA    2a02:6b8::1001
ns4.yandex.ru.          6869    A       77.88.21.1
                        2617    AAAA    2a02:6b8:0:1::1:1
...
Необходимо получить список: «домен ipv4» для A записей. Если для одного домена несколько ip, то несколько записей в списке. Проблема с доменами для которых есть несколько записей, bind указывает их не на каждой строчке. Может ключ какой есть(в man не нашел) для приведения к более читаемому виду или без заумного парсера(подставляющего значения в пустые строки) тут не обойтись?

Deleted

Пока не высказались гуру sed и awk, вот решение в лоб на си:

#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <string.h>

#define STRL (HOST_NAME_MAX + 2)

int main()
{
        char fqdn[STRL], type[STRL], res[STRL], prevfqdn[STRL];
        int ttl;
        char line[1024*4];
        int rc;

        prevfqdn[0] = '\0';
        for (;;) {
                fgets(line, sizeof(line), stdin);
                if (feof(stdin)) break;

                rc = sscanf(line, "%s %d %s %s", fqdn, &ttl, type, res);
                if (rc == 4) {
                        strncpy(prevfqdn, fqdn, STRL);
                }
                if (rc == 1) {
                        sscanf(line, "%d %s %s", &ttl, type, res);
                        strncpy(fqdn, prevfqdn, STRL);
                }
                if (strcmp("A", type) == 0) {
                        printf("%s\t%s\n", fqdn, res);
                }
        }

        return 0;
}
$ cc scan_bind.c
$ ./a.out < cache.txt
Deleted
()
Ответ на: комментарий от Deleted

Пока не высказались гуру sed и awk

их-то я и ждал.

вот решение в лоб на си

Тоже вариант. Спасибо, попробую.

Deleted
()
Ответ на: комментарий от Deleted
#!/bin/bash

while read D TTL TYP ADR ; do
    if [ -n "$ADR" ] ; then
        DOM=$D
    else
        ADR=$TYP; TYP=$TTL
    fi
    [ "$TYP" = A ] && echo $DOM $ADR
done
mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.