【问题标题】:Printing specific elements from dig, using bash使用 bash 从 dig 打印特定元素
【发布时间】:2021-11-30 21:10:57
【问题描述】:

我正在尝试编写一个 bash 脚本,从列表中挖掘某些网站上的 MX。
除了域拥有的 MX 之外,我不需要所有冗余信息。

到目前为止,这是我的脚本的样子:

#! /bin/bash


{ while IFS=';' read un fake
do
        dig mx $un >> tmp.txt
        awk -F ';' ' {print $1}' tmp.txt >> mxinfo.txt

done
} <mxlist.txt

mxlist.txt:

vg.no;
godaddy.com;
finn.no;

我从中得到的输出是一整行的空白空间。

我希望它像这样打印:

vg.no = ASPMX.L.GOOGLE.COM
vg.no = ALT1.ASPMX.L.GOOGLE.COM
vg.no = ALT2.ASPMX.L.GOOGLE.COM
vg.no = ALT3.ASPMX.L.GOOGLE.COM
godaddy.com = godaddy-com.mail.protection.outlook.com
finn.no = alt2.aspmx.l.google.com
finn.no = aspmx.l.google.com
finn.no = alt1.aspmx.l.google.com
finn.no = alt4.aspmx.l.google.com
finn.no = alt3.aspmx.l.google.com

您还看到一些查询出现两次或多次。
如果没有额外的间距、冗余信息和每个域只有一个输出,我怎样才能写得更好?

【问题讨论】:

    标签: bash scripting dig


    【解决方案1】:

    只使用host 怎么样,像这样:

    $ host -t mx vg.no
    vg.no mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM.
    vg.no mail is handled by 10 ALT4.ASPMX.L.GOOGLE.COM.
    vg.no mail is handled by 1 ASPMX.L.GOOGLE.COM.
    vg.no mail is handled by 10 ALT3.ASPMX.L.GOOGLE.COM.
    vg.no mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM.
    

    ...但是让我们处理您的脚本。我看到的第一个问题是,对于每个域,您将dig 输出附加到 tmp.txt,然后对其进行处理。但这意味着当它处理第二个域时,来自第一个域的 dig 输出仍然在 tmp.txt 中(它被附加到,而不是被替换),所以它被再次处理。然后在第三次迭代中,第一个 和第二个 域仍然存在,因此它们都被再次处理,等等。

    解决方案:要么使用单个&gt;(即&gt; tmp.txt)直接替换内容,要么直接跳过临时文件并将输出直接传送到awk(或接下来的任何内容)。

    第二个问题是awk 命令awk -F ';' ' {print $1}' 只是打印第一个“;”之前的所有内容在每一行。它甚至在以分号开头的行上打印,或者只是空白;在这两种情况下,它都会打印空行。所以你的输出中有很多空行。此外,在 确实 具有相关内容的行上,它不会删除除 MX 域本身之外的所有额外数据:

    vg.no.          300 IN  MX  1 ASPMX.L.GOOGLE.COM.
    vg.no.          300 IN  MX  10 ALT4.ASPMX.L.GOOGLE.COM.
    ...
    

    您可以修复 awk 脚本以删除空白行和不相关的数据,但使用 dig +short 跳过不相关的位会更简单:

    $ dig +short mx vg.no
    5 ALT2.ASPMX.L.GOOGLE.COM.
    1 ASPMX.L.GOOGLE.COM.
    10 ALT4.ASPMX.L.GOOGLE.COM.
    5 ALT1.ASPMX.L.GOOGLE.COM.
    10 ALT3.ASPMX.L.GOOGLE.COM.
    

    要获得示例中表单中的输出,您只需要一个简短的awk 程序来删除优先级字段并为正在查找的域名添加前缀:

    $ un=vg.no
    $ dig +short mx "$un" | awk -v un="$un" '{print un " = " $2}'
    vg.no = ASPMX.L.GOOGLE.COM.
    vg.no = ALT4.ASPMX.L.GOOGLE.COM.
    vg.no = ALT1.ASPMX.L.GOOGLE.COM.
    vg.no = ALT3.ASPMX.L.GOOGLE.COM.
    vg.no = ALT2.ASPMX.L.GOOGLE.COM.
    

    请注意,MX 记录没有任何特定顺序;如果您希望它们按优先级排序,请将sort -g 添加到digawk 之间的管道中。

    【讨论】:

    • 感谢您的解释!工作就像一个魅力,我学到了一些新东西。另外我唯一想知道的是,“$2”是做什么的?
    • @MCmcoy 在awk 程序中,$2 指的是输入文件当前行的第二个字段。 (它看起来很像 $2 是脚本/函数/其他的第二个 argument 的 shell 语法,但它们并不真正相关。)在此处的 dig 输出中, priority 将是第一个字段,服务器主机名是第二个字段,因此它会打印域名、“=”和服务器主机名。
    • 再次感谢戈登!非常感谢!
    猜你喜欢
    • 2012-02-07
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多