我使用以下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
我该怎么做?帮助将不胜感激
答案 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}/{...}
IN A
这会选择看起来像gsub(/\.$/,"",$1)
后跟IP地址的行。 (实际上,我们只检查三组数字后跟一个句号,但是,这里已经足够了。)对于那些只有那些行,执行大括号内的命令。
print $1","$NF
对于选定的行,我们从第一个字段的末尾删除句点。
for domain in $(cat domains.txt)
对于选定的行,我们打印第一个字段,一个逗号和最后一个字段,
命令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
(代表替代)/
匹配正则表达式/
您想要的/