如何使用dig控制bash中的de输出?

时间:2017-12-22 23:26:23

标签: regex bash dig

我使用以下bash来获取domains.txt

中多个域的DNS记录
#!/bin/bash
for domain in $(cat domains.txt); do dig @8.8.8.8 $domain ANY +multiline +noall +answer +nocmd; done

当前的挖掘输出是:

; <<>> DiG 9.8.3-P1 <<>> @8.8.8.8 aeapi.bluetail.salesforce.com ANY +multiline +noall +answer +nocmd
; (1 server found)
;; global options: +cmd
site.com. 59 IN A 0.0.0.1
site.com. 59 IN A 0.0.0.0

我喜欢以下列格式获得输出:

site.com,0.0.0.1
site2.com,0.0.0.2
site3.com,0.0.0.4

我该怎么做?帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

仅以逗号分隔格式显示for domain in $(cat domains.txt); do dig @8.8.8.8 $domain ANY +multiline +noall +answer +nocmd; done | awk '/IN A ([[:digit:]]+\.){3}/{gsub(/\.$/,"",$1); print $1","$NF}' 行:

for domain in $(cat domains.txt)
do
   dig @8.8.8.8 $domain ANY +multiline +noall +answer +nocmd
done | awk '/IN A ([[:digit:]]+\.){3}/{gsub(/\.$/,"",$1); print $1","$NF}'

或者,对于那些喜欢他们的命令分布在多行的人:

/IN A ([[:digit:]]+\.){3}/{...}

如何运作

  1. IN A

    这会选择看起来像gsub(/\.$/,"",$1)后跟IP地址的行。 (实际上,我们只检查三组数字后跟一个句号,但是,这里已经足够了。)对于那些只有那些行,执行大括号内的命令。

  2. print $1","$NF

    对于选定的行,我们从第一个字段的末尾删除句点。

  3. for domain in $(cat domains.txt)

    对于选定的行,我们打印第一个字段,一个逗号和最后一个字段,

  4. 除了

    命令domains.txt有一些问题。特别是,domains.txt的内容将受到分词路径名扩展的影响,这可能会导致意外行为。根据{{​​1}}的格式,有更好的方法来阅读此文件的内容。

    在输出中添加双引号

    for domain in $(cat domains.txt); do dig @8.8.8.8 $domain ANY +multiline +noall +answer +nocmd; done | awk '/IN A ([[:digit:]]+\.){3}/{gsub(/\.$/,"",$1); printf "\"%s\",\"%s\"\n",$1,$NF}'
    

答案 1 :(得分:1)

您可以将dig输出传播到任何其他程序。你可能想用sed,我更习惯grep。 grep -v -e "<regex>"将删除与正则表达式<regex>匹配的任何行。

我们来解释正则表达式"^$\|^;"^$代表空行,^;代表以;开头的行,|表示逻辑运算符OR,\转义|字符(它告诉grep这是一个运算符而不是常规字符)。

所以你可能想要的命令是这样的:

$ dig stackoverflow.com | grep -v -e "^$\|^;"

stackoverflow.com.      1003    IN      A       151.101.1.69
stackoverflow.com.      1003    IN      A       151.101.193.69
stackoverflow.com.      1003    IN      A       151.101.129.69

编辑:如果你想摆脱1003 IN A,你可以输入sed命令:

sed "s/.\s*[0-9]*\s*IN\s*A\s*/, /"

格式为s(代表替代)/匹配正则表达式/您想要的/