我正在尝试生成一个临时主机文件,该文件基于 dnsmasq 提供的 DNS 日志。我已经让它大部分工作了,但是我在使用 CNAME 时遇到了问题。我将展示我迄今为止所取得的成就。
我需要获取日志中有 3 种类型的响应。最简单的很容易从日志中提取,例如
Jun 20 14:27:59 dnsmasq[2551]: reply stackoverflow.com is 64.34.119.12
这可以输出到“64.34.119.12 stackoverflow.com”使用
grep reply /tmp/dnslog | grep -v 'NXDOMAIN\|NODATA' | awk '{print $8 " " $6}'
另一种类型的日志涉及 CNAME,这里是一个示例;
Jun 20 14:42:11 dnsmasq[2551]: reply www.videolan.org is <CNAME>
Jun 20 14:42:11 dnsmasq[2551]: reply ganesh.videolan.org is 88.191.250.2
这可以输出到“88.191.250.2 ganesh.videolan.org www.videolan.org”使用
grep reply /tmp/dnslog | grep -v 'NXDOMAIN\|NODATA' | awk '{print $8 "\t" $6}' | awk '/CNAME/ {name=$2; getline ; print $0 " " 'name'}'
但是此方法不适用于以下类型的日志,其中有多个 CNAME
Jun 20 15:00:42 dnsmasq[2551]: reply en.wikipedia.org is <CNAME>
Jun 20 15:00:42 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME>
Jun 20 15:00:42 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225
前面的命令给出以下结果
<CNAME> wikipedia-lb.wikimedia.org en.wikipedia.org
通过使用提到的第一个命令和第二个命令,wikipedia-lb.esams.wikimedia.org 与 91.198.174.225 关联,但是 wikipedia-lb.wikimedia.org 与 wikipedia-lb.esams.wikimedia.org 不关联。理想的结果应该如下
91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org en.wikipedia.org
为了解决这个问题,我认为需要向后读取文件,但是这样做不会弄乱 awk 的 getline 部分,以追加到下一行吗?
理想情况下,我想将两种类型的日志组合成一个命令,然后输出所有内容,而不必分别运行这两个脚本。任何人都可以协助修改 awk 命令来执行此操作吗?
这是“grep reply /var/dnslog”的示例,以及要输出的所需主机文件。目前还有其他次要问题。这些在所需的主机输出中突出显示。
Jun 20 15:28:21 dnsmasq[2551]: reply photos-a.ak.fbcdn.net is <CNAME>
Jun 20 15:28:21 dnsmasq[2551]: reply photos-a.ak.facebook.com.edgesuite.net is <CNAME>
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.25
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.48
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.64
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.9
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.26
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.51
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.8
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.50
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.65
Jun 20 15:28:22 dnsmasq[2551]: reply stackoverflow.com is 64.34.119.12
Jun 20 15:29:41 dnsmasq[2551]: reply www.wikipedia.org is <CNAME>
Jun 20 15:29:41 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME>
Jun 20 15:29:41 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225
Jun 20 15:29:42 dnsmasq[2551]: reply en.wikipedia.org is <CNAME>
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME>
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225
Jun 20 15:29:42 dnsmasq[2551]: reply ja.wikipedia.org is <CNAME>
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME>
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225
主机文件
213.200.108.26 a995.dspmm1.akamai.net photos-a.ak.facebook.com.edgesuite.net photos-a.ak.fbcdn.net
##ideally select 1 host at random from multiple of a995.dspmm1.akamai.net, although list may be randomised already so 1st will suffice##
64.34.119.12 stackoverflow.com
91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org www.wikipedia.org
91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org en.wikipedia.org
91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org ja.wikipedia.org
##Ideally, detect these similarities for wikipedia and convert the 3 lines into this;##
91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org www.wikipedia.org en.wikipedia.org ja.wikipedia.org
目的是文件将可分布在低带宽、高延迟的链路上,因此文件应尽可能小。我知道长时间使用此文件会导致很多问题,我已将文件配置为仅在短时间内有效。如果有人可以帮助解决指出的问题,将不胜感激。此外,我的可用 UNIX 应用程序范围有限。如果上述可以在awk中实现,那将是可取的。先感谢您!