【问题标题】:How can I control de output in bash using dig?如何使用 dig 控制 bash 中的 de 输出?
【发布时间】:2017-12-22 23:26:23
【问题描述】:

我使用以下 bash 来获取 domain.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


    【解决方案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}'
    

    工作原理

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

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

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

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

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

    【讨论】:

    • 感谢 John1024。现在输出为:“domain.com.21599 IN A 127.0.0.1”,我想将输出更改为:“domain.com,127.0.0.1”(用逗号分隔)
    • @pancho 好的。请参阅更新以了解仅以逗号分隔格式打印 IP 行的方法。
    • 你好。如何在输出中添加 " 例如:"3d.ebay.com","66.211.188.45" with print "$1"",""$NF" ??
    • @pancho 好的。我在答案的末尾添加了一个在输出周围加上双引号的示例。
    【解决方案2】:

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

    解释一下正则表达式"^$\|^;"^$表示空行,^;表示以;开头的行,|表示逻辑运算符OR,\转义@ 987654330@ 字符(它告诉 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(代表替代)/匹配正则表达式/你想要的/

    【讨论】:

    • 次要问题:grep -v 命令匹配匹配正则表达式的任何行
    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 2022-01-22
    • 2016-03-24
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2021-12-17
    相关资源
    最近更新 更多