欢迎 jack12345678 加入本站!
 免费注册  用户登陆  汇款方式  汇款确认  产品报价  联系我们  帮助中心
加入收藏
设为首页
会员体系
申请VIP
网站首页 光盘超市 软件下载 技术文章 专题 用户中心 VIP会员 技术论坛 网站留言 娱乐中心 卓越资源
今天是:2008年11月20日 星期四  您现在位于: 首页 → 技术文章 → awk分段处理记录并格...
   awk分段处理记录并格式化输出(处理LDAP文件和DHCP记录)
作者:coolend.cublog.cn  出处:coolend.cublog.cn  更新时间: 2007年05月09日 
awk功能真是强大!可用来分段处理记录(即要处理的数据一段一段的),把记录中指定的部分取出并重新格式化输出 ...

=======================================
例子1. 分析LDAP记录(ldif格式的记录文本)
=======================================

现在有这样一笔记录,分段形式的,即:记录与记录之间以空行分割,如下:

uid: test
cn: test
sn: test user
o: people
mail: test@example.com
status: enabled
quota: 100
domain: example.com

uid: alice
cn: Alice
sn: alice user
o: people
mail: alice@example.com
status: enabled
quota: 200
domain: example.com

uid: bob
cn: boby
sn: bob user
o: people
mail: bob@example.com
status: enabled
quota: 300
domain: example.com

现在想取出上述记录中的某些字段,比如uid,cn,mail,quota,并且每个记录以一行的方式输出,脚本:

# awk -F ': ' '{if(/^uid|^cn|^mail|^quota/) {ORS=" "; print $2};
                if(/^$/){ORS=" "; print ""}
               }' data.ldif
输出结果:

test test test@example.com 100
alice Alice alice@example.com 200
bob boby bob@example.com 300

脚本说明:
     awk处理时,默认将一行视为一个记录,但这里我们需要的是每一段为一个记录,由于段于段之间是以空行分割的,所以在没有遇到空行时,修改ORS为空格,表示同一个记录的不同部分;遇到空行时,修改ORS为换行,表示这个记录已经完了,这样就达到了我们的要求。
    ORS意为 Output Record Seperator,即输出记录分割符,默认ORS为换行( )。

=======================================
例子2. 分析DHCP的lease记录(dhcpd.leases)
=======================================

lease 192.168.1.200 {
  starts 2 2005/12/06 06:14:04;
  ends 2 2005/12/06 18:14:04;
  tstp 2 2005/12/06 18:14:04;
  binding state free;
  hardware ethernet 00:11:5b:15:61:e8;
}
lease 192.168.1.197 {
  starts 2 2005/12/06 06:41:01;
  ends 2 2005/12/06 18:41:01;
  tstp 2 2005/12/06 18:41:01;
  binding state free;
  hardware ethernet 00:0a:eb:12:71:3b;
}
lease 192.168.1.191 {
  starts 3 2005/12/07 01:31:19;
  ends 3 2005/12/07 01:33:19;
  tstp 3 2005/12/07 01:33:19;
  binding state free;
  hardware ethernet 00:0c:29:09:52:d8;
}
lease 192.168.1.195 {
  starts 3 2005/12/07 01:31:20;
  ends 3 2005/12/07 13:31:20;
  tstp 3 2005/12/07 13:31:20;
  binding state active;
  next binding state free;
  hardware ethernet 00:0c:29:09:52:d8;
}
lease 192.168.1.194 {
  starts 3 2005/12/07 01:50:20;
  ends 3 2005/12/07 13:50:20;
  tstp 3 2005/12/07 13:50:20;
  binding state active;
  next binding state free;
  hardware ethernet 00:e0:4c:c9:86:56;
}

现在要查看当前活动的租约记录(已分配的IP/起始时间/过期时间/目标机器的MAC地址),脚本:

cat dhcpd.leases|grep -v ^#|awk
     '{if(/^lease|^  binding|^  starts|^  ends|^  hardware/)
          { ORS=" " ; for(i=2;i<=NF;i++) {print $i}}
       if(/^}$/) { ORS="\n"; print ""}
     }'| grep active|awk '{print $1,$4,$5,$7,$8,$12}'|sed 's/;//g'
注:上述脚本应该在一行,为了方便阅读才分开显示的

输出结果:
192.168.1.195 2005/12/07 01:31:20 2005/12/07 13:31:20 00:0c:29:09:52:d8
192.168.1.194 2005/12/07 01:50:20 2005/12/07 13:50:20 00:e0:4c:c9:86:5

脚本说明:grep -v ^# 过滤掉租约记录里面的注释
         awk '{ ....}' 上面已经说明了
            里面有个for循环,目的是依次输出从第2个开始到最后的field
         grep active 取出处于活动状态的记录,过滤掉过期的记录
         awk '{ ...}' 格式化输出
         sed 's/;//g' 删除输出中的分号

更简单的脚本:

grep -v ^# dhcpd.leases| awk 'BEGIN{RS="}"}
   /binding state active/{gsub(/;|"/,"");
    print $2,$6,$7,$10,$11,$21}'
 (本文已被浏览 5064 次)
 发布人:sdccf
 → 推荐给我的好友
上篇文章:GRUB故障 --- 满屏显示GRUB字符
下篇文章:Linux命令提示符下的热键映射
 相关文章:
一个awk应用的小例子 几个Awk应用实例
用AWK实现DB2数据库Schema的同步 awk自动创建格式化文本
awk里面的一些隐藏特性 gawk 收取邮件测试
C与脚本语言awk混合编程 c语言调用gawk
shell学习资料汇总 Awk编程学习资料
Awk 实例(三) Awk 实例(二)
Awk 实例(一) Unix awk使用手册(6)
Unix awk使用手册(5) Unix awk使用手册(4)
Unix awk使用手册(1) Unix awk使用手册(3)
Unix awk使用手册(2) 使用Linux 文本工具简化数据的提取(3)

相关搜索
查看百度中关于awk分段处理记录并格式化输出(处理LDAP文件和DHCP记录)的更多内容
查看google中关于awk分段处理记录并格式化输出(处理LDAP文件和DHCP记录)的更多内容
   文章分类
操作系统 |
SCO_UNIX  Sun_Solaris  IBM_AIX  HP_UX  Linux  BSD  Tru64_UNIX 
通用UNIX知识  Windows  Minix 
程序设计 |
Shell编程  C/C++  汇编  PHP  JAVA  Perl  Python 
ASP/HTML  XML  中间件 
数据库 |
Oracle  Informix  Sybase  Fox  DB2  SQL  MySQL 
PostgreSQL 
网络应用 |
网络应用 
计算机硬件 |
计算机主机  打印机  路由器  交换机  终端  磁带机  MO 
刻录机  终端服务器  调制解调器 
   文章评论
  → 评论内容 (点击查看)   共0条评论,每页显示5条评论   浏览所有评论
(没有相关评论)
  → 发表我的评论
您的姓名: 您的Email:
评论内容:
250字内
发表评论:      发表评论须知 →
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  • 关于我们 ┋  网站留言 ┋  网站地图 ┋  友情链接 ┋  与我在线 ┋  汇款确认 ┋  管理 ┋  TOP
    Linux.Unix爱好者家园  http://www.unix-cd.com/
    联系我们:sdccf@163.com
    腾讯QQ: 7644599
    备案序号:鲁ICP备05000455号
    Copyright (c) 2001-2008 Unix-cd.com. All Rights Reserved.