首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用awk逐行向后搜索,并将结果追加到下一行。

使用awk逐行向后搜索,并将结果追加到下一行。
EN

Stack Overflow用户
提问于 2012-06-20 15:09:28
回答 2查看 1.6K关注 0票数 2

我正在尝试生成一个临时主机文件,该文件基于dnsmasq提供的DNS日志。我已经让它大部分的工作,但我有一个问题的CNAME。我将展示我迄今所取得的成就。

日志中有3种类型的响应,我需要得到。最简单的方法很容易从原木中提取出来。

代码语言:javascript
运行
复制
Jun 20 14:27:59 dnsmasq[2551]: reply stackoverflow.com is 64.34.119.12

这可以输出到"64.34.119.12 stackoverflow.com“

代码语言:javascript
运行
复制
grep reply /tmp/dnslog | grep -v 'NXDOMAIN\|NODATA' | awk '{print $8 " " $6}'

另一种类型的日志涉及CNAME,以下是一个例子;

代码语言:javascript
运行
复制
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“

代码语言:javascript
运行
复制
grep reply /tmp/dnslog | grep -v 'NXDOMAIN\|NODATA' | awk '{print $8 "\t" $6}' | awk '/CNAME/ {name=$2; getline ; print $0 " " 'name'}'

但是,此方法不适用于以下类型的日志,其中存在多个CNAME

代码语言:javascript
运行
复制
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

前面的命令给出了以下结果

代码语言:javascript
运行
复制
<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无关。理想的结果应该是:

代码语言:javascript
运行
复制
91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org      en.wikipedia.org

为了解决这个问题,我相信文件需要向后读取,但是这样做不会搞乱awk的getline部分,从而追加到下一行吗?

理想情况下,我希望将这两种类型的日志合并到一个命令中,然后该命令将输出所有内容,而不是单独运行两个脚本。有人能帮助修复awk命令来做到这一点吗?

下面是一个示例“/var/dnslog",以及要输出的所需主机文件。目前还有其他问题是次要的。它们在所需的主机输出中突出显示。

代码语言:javascript
运行
复制
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

主机文件

代码语言:javascript
运行
复制
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中实现上述目标,那就更好了。提前谢谢你!

EN

回答 2

Stack Overflow用户

发布于 2012-06-20 15:27:55

awksort的结合

代码语言:javascript
运行
复制
..|awk '{if($8 ~ /<CNAME>/){load=load" "$6}else{print $8" "load" "$6;load=""}}'
  | sort -u -k2
票数 0
EN

Stack Overflow用户

发布于 2012-09-06 14:08:01

使用awk -f parse.awk dnsmasq.log调用。

代码语言:javascript
运行
复制
/reply/ { 
    host = $6;
    ip = $8;

    names[length(names)+1] = host;

    if (ip !~ /CNAME/) {
    # assign all names up to now the same IP
    # This will overwrite any previous IP assignment as well
    for (i in names) IPs[names[i]] = ip;
    delete names;
    }
}

END {
    # collate hostnames for a particular IP
    for (host in IPs) hosts[IPs[host]] = hosts[IPs[host]]" "host;
    for (IP in hosts) print IP hosts[IP];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11122556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档