Разбор выходных данных dig, экспорт csv

используя команду dig в сценарии оболочки и хотите вывести флаги формата csv и раздел полномочий

dig @ns1.hosangit.com djzah.com +noall +authority +comments

выход

; <<>> DiG 9.8.3-P1 <<>> @ns1.hosangit.com djzah.com +noall +authority +comments
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64505
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; AUTHORITY SECTION:
djzah.com.  3600    IN  NS  ns3.eventguyz.com.
djzah.com.  3600    IN  NS  ns1.eventguyz.com.
djzah.com.  3600    IN  NS  ns2.eventguyz.com.

Ожидаемый результат для csv ( domain, flags (не всегда эти три), authority section (может быть 5)):

djzah.com,qr,aa,rd,ns3.eventguyz.com,ns1.eventguyz.com,ns2.eventguyz.com

Я пытался использовать awk и/или sed, но у меня возникли трудности с поиском шаблона, например, для раздела флагов ;; флаги: (затем используйте пробел, пока не дойдете до ;)

Затем раздел «Власть», я полагаю, вы будете искать ;; РАЗДЕЛ AUTHORITY: Затем создайте массив и используйте только последний.

Я не знаю, что я делаю.


person user3666682    schedule 04.08.2014    source источник


Ответы (1)


#!/usr/bin/awk -f
BEGIN { OFS = "," }
/^;; flags:/ {
    sub(/;; flags: /, "")
    sub(/;.*$/, "")
    $1 = $1
    flags = "," $0
    next
}
/^;/ || NF < 5 { next }
!($1 in a) {
    keys[++k] = $1
}
{
    t = $5
    sub(/[.][ \t\r]*$/, "", t)
    a[$1] = a[$1] "," t
}
END {
    for (i = 1; i <= k; ++i) {
        key = keys[k]
        t = key
        sub(/[.][ \t\r]*$/, "", t)
        print t flags a[key]
    }
}

Использование:

dig @ns1.hosangit.com djzah.com +noall +authority +comments | awk -f script.awk

Контрольная работа:

awk -f script.awk sample

Выход:

djzah.com,qr,aa,rd,ns3.eventguyz.com,ns1.eventguyz.com,ns2.eventguyz
  • BEGIN { OFS = "," }: Каждый раздел в awk всегда запускается каждый раз при обработке записи. Блок BEGIN запускается только один раз при запуске. Это в основном устанавливает OFS в ,.
  • /^;; flags:/ соответствует ;; flags:. Представленный им раздел в основном извлекает флаги из записи (строки). Команды sub в основном удаляют из записи ненужные части. $1 = $1 просто следит за тем, чтобы $0 обновлялся с помощью OFS. flags = "," $0 присваивает разделенные запятыми флаги переменной flags. next заставляет awk перейти к следующей записи.
  • /^;/ || NF < 5 { next } в основном заставляет awk пропускать ненужные строки.
  • !($1 in a) { keys[++k] = $1 } если $1 например. djzah.com. встречается впервые, добавьте в массив ключей.
  • { t = $5; sub(/[.][ \t\r]*$/, "", t); a[$1] = a[$1] "," t } добавляет значение 5-го столбца, например. ns3.eventguyz.com в коллекцию с удаленным ведущим ..
  • По завершении обработки выполняется блок END. Он перебирает найденные ключи и печатает связанные с ним данные.
person konsolebox    schedule 04.08.2014
comment
Не могли бы вы прокомментировать свой awk скрипт. ОП, вероятно, мог бы многому научиться у него. - person skamazin; 04.08.2014
comment
@user3666682 user3666682 Было бы неплохо, если бы вы привели больше примеров, в которых это не работает. - person konsolebox; 04.08.2014
comment
Спасибо за сценарий. Хотелось бы узнать, как это работает. Как сказал скамазин, не могли бы вы добавить комментарии, чтобы помочь мне понять, как все происходит? Кстати, он отлично работает, просто хотел бы я знать, как он работает. :) - person user3666682; 04.08.2014
comment
@user3666682 user3666682 Добавил несколько комментариев. - person konsolebox; 04.08.2014
comment
Круто, большое спасибо за помощь. Надеюсь, я поймаю раньше, чем позже. :) - person user3666682; 04.08.2014
comment
@user3666682 Всегда очень полезно читатьРуководство пользователя GNU Awk, даже просто однажды. - person konsolebox; 04.08.2014
comment
Еще раз спасибо, консольбокс. Я просмотрю его и посмотрю, смогу ли я понять свою проблему. Похоже, скрипт пропускает домены, которые либо не имеют всех флагов (только qr rd), ИЛИ, может быть, это потому, что у них нет авторитетных серверов... пока не уверен. - person user3666682; 04.08.2014