如何使用 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}'
工作原理
/IN A ([[:digit:]]+\.){3}/{...}
这会选择看起来像 IN A
后跟 IP 地址的行。 (实际上,我们只检查三组数字后跟一个句点,但在这里,这已经足够了。)对于那些并且只有那些行,大括号内的命令被执行。
gsub(/\.$/,"",)
对于选定的行,我们从第一个字段的末尾删除句点。
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
(代表替代)/
匹配正则表达式/
你想要什么/
我使用以下 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}'
工作原理
/IN A ([[:digit:]]+\.){3}/{...}
这会选择看起来像
IN A
后跟 IP 地址的行。 (实际上,我们只检查三组数字后跟一个句点,但在这里,这已经足够了。)对于那些并且只有那些行,大括号内的命令被执行。gsub(/\.$/,"",)
对于选定的行,我们从第一个字段的末尾删除句点。
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
(代表替代)/
匹配正则表达式/
你想要什么/