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

How can I control de output in bash using 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

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

以逗号分隔格式仅显示 IN A 行:

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(/\.$/,"",); print ","$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(/\.$/,"",); print ","$NF}'

工作原理

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

    这会选择看起来像 IN A 后跟 IP 地址的行。 (实际上,我们只检查三组数字后跟一个句点,但在这里,这已经足够了。)对于那些并且只有那些行,大括号内的命令被执行。

  2. gsub(/\.$/,"",)

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

  3. print ","$NF

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

放在一边

命令 for domain in $(cat domains.txt) 有一些问题。特别是,domains.txt 的内容将受到 分词 路径名扩展 的影响,这可能会导致意外行为。根据 domains.txt 的格式,将会有更好的方式来读取此文件的内容。

在输出中添加双引号

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(/\.$/,"",); printf "\"%s\",\"%s\"\n",,$NF}'

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

匹配的任何行

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

所以您可能需要的命令是这样的:

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

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

编辑:如果你想去掉 1003 IN A,你可以通过管道输入 sed 命令:

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

格式是s(代表替代)/匹配正则表达式/你想要什么/