在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
但很难搜索像标志部分这样的模式;; 标志:(然后使用空格分隔符,直到到达 ;(
然后是权威部分,我假设你会搜索;;权限部分:然后创建一个数组,只使用最后一个。
我不知道我在做什么。
#!/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(/[.][ tr]*$/, "", t)
a[$1] = a[$1] "," t
}
END {
for (i = 1; i <= k; ++i) {
key = keys[k]
t = key
sub(/[.][ tr]*$/, "", 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,例如djzah.com.
第一次遇到,请添加到键数组。 -
{ t = $5; sub(/[.][ tr]*$/, "", t); a[$1] = a[$1] "," t }
添加第 5 列的值,例如ns3.eventguyz.com
到删除前导.
的集合。 - 处理完成后,
END
块将执行。它循环访问找到的键并打印绑定到它的数据。