首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析dig输出输出csv

解析dig输出输出csv
EN

Stack Overflow用户
提问于 2014-08-04 11:24:46
回答 1查看 2.8K关注 0票数 1

在shell脚本中使用dig命令,并希望将其输出到csv格式标志和授权部分

代码语言:javascript
复制
dig @ns1.hosangit.com djzah.com +noall +authority +comments

输出

代码语言:javascript
复制
; <<>> 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的预期输出是( domainflags (并不总是这三个),authority section (可能是5) ):

代码语言:javascript
复制
djzah.com,qr,aa,rd,ns3.eventguyz.com,ns1.eventguyz.com,ns2.eventguyz.com

我试图使用awk和/或sed,但在搜索一个模式时遇到了困难,比如;;标志:(然后使用空格分隔符,直到到达;)。

然后,我假设您将搜索;;部分:,然后创建一个数组,并且只使用最后一个数组。

我不知道我在做什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-04 11:49:35

代码语言:javascript
复制
#!/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]
    }
}

用法:

代码语言:javascript
复制
dig @ns1.hosangit.com djzah.com +noall +authority +comments | awk -f script.awk

测试:

代码语言:javascript
复制
awk -f script.awk sample

输出:

代码语言:javascript
复制
djzah.com,qr,aa,rd,ns3.eventguyz.com,ns1.eventguyz.com,ns2.eventguyz
  • BEGIN { OFS = "," }:每次处理记录时,awk中的每个部分都会运行。开始时只运行一次。这基本上将OFS设置为,
  • /^;; flags:/;; flags:匹配。它提供的部分基本上从记录(行)中提取标志。sub命令基本上从记录中删除不必要的部分。$1 = $1只是确保使用OFS更新$0。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块。它遍历找到的键并打印绑定到它的数据。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25117550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档