1

在 shell 脚本中使用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 SECTION: 然后创建一个数组并且只使用最后一个。

我不知道我在做什么。

4

1 回答 1

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只需确保使用 OFS 更新 $0。flags = "," $0将现在以逗号分隔的标志分配给flags变量。next使 awk 跳转到下一条记录。
  • /^;/ || NF < 5 { next }基本上使 awk 跳过不必要的行。
  • !($1 in a) { keys[++k] = $1 }如果第一次遇到 $1 eg djzah.com.,则添加到 keys 数组。
  • { t = $5; sub(/[.][ \t\r]*$/, "", t); a[$1] = a[$1] "," t }例如,将第 5 列的值添加到删除ns3.eventguyz.com了前导的集合中。.
  • 处理完成后,END块执行。它遍历找到的键并打印绑定到它的数据。
于 2014-08-04T11:49:35.287 回答