免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: platinum
打印 上一主题 下一主题

取一个段落中关键字的问题(已解决) [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
31 [报告]
发表于 2005-05-17 22:13 |只看该作者

取一个段落中关键字的问题(已解决)

oh. bug found...
要將 ^lease 改為 lease 了...  ^_^

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
32 [报告]
发表于 2005-05-18 00:24 |只看该作者

取一个段落中关键字的问题(已解决)

我想这个问题用awk比较适合。试试这个:
  1. awk -F"[ ;]" '/^lease|hard/{printf $(NF-1)}/{/{printf " "}/}/{print ""}'
复制代码

上面将硬件地址缺失的作为空字段列出,如果需要可以进一步过滤掉这些行:
  1. awk -F"[ ;]" '/^lease|hard/{printf $(NF-1)}/{/{printf " "}/}/{print ""}' ur-file | grep -v " $"
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
33 [报告]
发表于 2005-05-18 10:25 |只看该作者

取一个段落中关键字的问题(已解决)

也可以这样:
  1. awk -F"[ ;]" '/lease/{ip=$(NF-1)}/hard/{printf "%s %s\n", ip, $(NF-1)}'
复制代码

论坛徽章:
0
34 [报告]
发表于 2005-05-18 11:50 |只看该作者

取一个段落中关键字的问题(已解决)

原帖由 "woodie" 发表:

awk -F"[ ;]" '/lease/{ip=$(NF-1)}/hard/{printf "%s %s\n", ip, $(NF-1)}'

woodieGG能讲解一下吗

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
35 [报告]
发表于 2005-05-18 12:19 |只看该作者

取一个段落中关键字的问题(已解决)

原帖由 "云飞舞" 发表:

woodieGG能讲解一下吗

非常乐意!

命令行选项-F"[ ;]" 告诉awk空格和分号都是字段分隔符,加入分号是为了后面提取mac地址时的方便。

/lease/{ip=$(NF-1)}表示当前行匹配lease时提取ip地址并暂存,而先不打印。

/hard/{printf "%s %s\n", ip, $(NF-1)}表示当前行匹配hard时打印暂存的ip地址和mac地址。如果没有hard这行的话是不会执行打印动作的。

不知道说清楚了没有?

论坛徽章:
0
36 [报告]
发表于 2005-05-18 12:28 |只看该作者

取一个段落中关键字的问题(已解决)

谢谢GG,我明白啦
我又演绎了一下,这样也能显示主机的hostname了

  1. cat /var/lib/dhcp/dhcpd.leases|awk -F"[ ;]" '/lease/{ip=$(NF-1)}/hard/{mac=$(NF-1)}/host/{printf "%s %s %s\n",ip,mac,$(NF-1)}'
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
37 [报告]
发表于 2005-05-18 15:05 |只看该作者

取一个段落中关键字的问题(已解决)

举一反三呀,不错!

不过这样mac地址取不到的问题又出来了。你可以想想怎么解决,提示一下,可以用个标志变量判断是否要打印。

论坛徽章:
0
38 [报告]
发表于 2005-05-18 15:37 |只看该作者

取一个段落中关键字的问题(已解决)

我现在创建了一个文件,内容是这样的
lease 192.168.102.187 {
  starts 3 2005/05/18 07:11:30;
  ends 2 2038/01/19 03:14:06;
  binding state active;
  next binding state free;
  hardware ethernet 00:07:95:ce:a0:55;
  uid "\001\000\007\225\316\240U";
  client-hostname "billgates";
}
lease 192.168.103.200 {
starts 5 2005/04/29 01:37:54;
ends 5 2005/04/29 01:37:54;
binding state free;
client-hostname "lenovo-2f31e43d";
}
lease 192.168.103.197 {
starts 5 2005/04/29 01:38:27;
ends 5 2005/04/29 01:38:27;
tstp 5 2005/04/29 01:38:27;
binding state free;
}
lease 192.168.102.197 {
starts 5 2005/04/29 01:38:27;
ends 5 2005/04/29 01:39:57;
tstp 5 2005/04/29 01:39:57;
binding state free;
hardware ethernet 00:0f:3d:21:8d:30;
uid "\001\000\017=!\2150";
}
lease 192.168.103.188 {
  starts 3 2005/05/18 07:11:37;
  ends 2 2038/01/19 03:14:06;
  binding state active;
  next binding state free;
  hardware ethernet 00:e0:4c:e5:06:6c;
  uid "\001\000\340L\345\006l";
  client-hostname "cq";
}

文件名字是test,里面包含了一些错误的DHCP申请记录信息,为什么执行结果是这样的?


  1. # cat test|awk -F"[ ;]" '/lease/{ip=$(NF-1)}/hard/{mac=$(NF-1)}/host/{printf "%s %s %s\n",ip,mac,$(NF-1)}'
  2. 192.168.102.187 00:07:95:ce:a0:55 "billgates"
  3. 192.168.103.200 00:07:95:ce:a0:55 "lenovo-2f31e43d"
  4. 192.168.103.188 00:e0:4c:e5:06:6c "cq"
复制代码

难道说,是因为第一次mac已经有了记录,所以第二个的时候就仍然保留了上次的mac信息吗?

论坛徽章:
0
39 [报告]
发表于 2005-05-18 17:13 |只看该作者

取一个段落中关键字的问题(已解决)

[quote]原帖由 "云飞舞"]难道说,是因为第一次mac已经有了记录,所以第二个的时候就仍然保留了上次的mac信息吗?[/quote 发表:

试试这个:
awk '
{ gsub(/;/,""
   if($0~/lease/)
       f = sprintf("%s ", $2)
   if($0~/hardware/)
       s = sprintf("%s", $3)
   if($0~/}/ && f != "" && s != ""{
       printf("%s %s \n", f, s)
       f = ""
       s = "" }
}' dhcpd.leases

运行结果:
192.168.102.187  00:07:95:ce:a0:55
192.168.102.197  00:0f:3d:21:8d:30
192.168.103.188  00:e0:4c:e5:06:6c

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
40 [报告]
发表于 2005-05-18 22:59 |只看该作者

取一个段落中关键字的问题(已解决)

原帖由 "woodie" 发表:
遖wk空格和分号都是字段分隔符,加入分号是为了后面提取mac地址时的方便。

/lease/{ip=$(NF-1)}表示当前行匹配lease时提取ip地址并暂存,而先不打印。

/hard/{printf "%s %s\n", ip, $(NF-1)}表示当前行匹配ha..........


呵.... 真妙! 讚一下!  ^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP