【问题标题】:Parse dig output export csv解析挖掘输出导出 csv
【发布时间】:2023-03-10 15:47:01
【问题描述】:

在 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 的预期输出是(domainflags(不总是这三个)、authority section(可能是 5)):

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

我试图使用awk 和/或sed,但在搜索标志部分这样的模式时遇到了困难 ;; flags:(然后使用空格分隔符,直到到达 ;

然后是权威部分,我假设你会搜索 ;;权威部门: 然后创建一个数组,只使用最后一个。

我不知道自己在做什么。

【问题讨论】:

    标签: parsing csv awk sed dig


    【解决方案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 &lt; 5 { next } 基本上让 awk 跳过不必要的行。
    • !($1 in a) { keys[++k] = $1 } 如果 $1 例如首次遇到djzah.com.,添加到keys数组中。
    • { t = $5; sub(/[.][ \t\r]*$/, "", t); a[$1] = a[$1] "," t } 添加第 5 列的值,例如ns3.eventguyz.com 到已删除前导 . 的集合。
    • 处理完成后,END 块执行。它遍历找到的键并打印绑定到它的数据。

    【讨论】:

    • 您介意评论您的awk 脚本吗? OP 可能会从中学到很多东西。
    • @user3666682 如果您提供更多不起作用的示例,那就太好了。
    • 感谢您的脚本。很想了解它是如何工作的。正如 skamazin 所说,您能否添加 cmets 来帮助我了解一切是如何发生的?顺便说一句,它确实很好用,只是希望我知道它是如何工作的。 :)
    • @user3666682 在上面添加了一些 cmets。
    • 太棒了,非常感谢您的帮助。希望我能尽快赶上。 :)
    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多