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

问题描述 投票:2回答:2

我使用以下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

我怎样才能做到这一点?帮助将不胜感激

regex bash dig
2个回答
1
投票

要以逗号分隔格式仅显示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(/\.$/,"",$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}'

How it works

  1. /IN A ([[:digit:]]+\.){3}/{...} 这将选择看起来像IN A后跟IP地址的行。 (实际上,我们只检查三组数字后跟一个句点,但是,这里已经足够了。)对于那些只有那些行,执行大括号内的命令。
  2. gsub(/\.$/,"",$1) 对于选定的行,我们从第一个字段的末尾删除句点。
  3. print $1","$NF 对于选定的行,我们打印第一个字段,逗号和最后一个字段,

Aside

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

Adding double-quotes to the output

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
投票

您可以将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(代表替代)/匹配正则表达式/你想要什么/

© www.soinside.com 2019 - 2024. All rights reserved.