免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3431 | 回复: 13
打印 上一主题 下一主题

awk格式化文本求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-07 15:35 |只看该作者 |倒序浏览
各位好!现有一段日志,截取如下

|070614 23:57:40|  rm -r abc
|070614 23:57:44|  exit
|070615 00:10:28|  exit
|070615 00:10:29|  exit
|070615 00:10:29|  exit
|070615 00:10:29|  exit
|070615 00:10:29|  exit
|070615 00:10:59|  cat /etc/passwd |grep 522
|070615 00:10:59|  cat /etc/passwd |grep 422
|070615 00:10:59|  cat /etc/passwd |grep 622
|070615 00:11:57|  history -100|grep rm
|070615 00:11:57|  history -100|grep rm
|070615 00:12:06|  exit
|070615 05:55:09|  exit
|070615 05:55:09|  exit
|070615 05:55:09|  exit
|070615 05:55:09|  exit


里面的exit总是批量出现的,我想把这样重复的若干行exit替换成一行固定文本,前面的时间戳等信息截取重复行中的最后一个,类似如下格式:
|070614 23:57:40|  rm -r abc
|070615 00:10:29|  specific
|070615 00:10:59|  cat /etc/passwd |grep 522
|070615 00:10:59|  cat /etc/passwd |grep 422
|070615 00:10:59|  cat /etc/passwd |grep 622
|070615 00:11:57|  history -100|grep rm
|070615 00:11:57|  history -100|grep rm
|070615 05:55:09|  specific



请问awk怎么实现啊?谢谢了

[ 本帖最后由 unixboy1106 于 2007-8-7 15:37 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-07 16:14 |只看该作者

  1. awk -F\| '{if($3~/exit/){b=$2}else{if(b != ""){print $0;print "|"b"|  specific";b=""}else{print $0}}}END{print "|"b"|  specific"}' urfile
复制代码

论坛徽章:
0
3 [报告]
发表于 2007-08-07 16:21 |只看该作者
谢谢楼上高手!

论坛徽章:
0
4 [报告]
发表于 2007-08-08 00:21 |只看该作者
能不能解释一下啊

论坛徽章:
0
5 [报告]
发表于 2007-08-08 00:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2007-08-08 00:48 |只看该作者
我也晕,能用了,还是想听达人解释一下。

论坛徽章:
0
7 [报告]
发表于 2007-08-08 00:58 |只看该作者
我简化了一下,有点不明白
awk -F\| '{if($3~/exit/){b=$2}else{print $0}}' urlfile
得出的是
|070614 23:57:40|  rm -r abc
|070615 00:10:59|  cat /etc/passwd |grep 522
|070615 00:10:59|  cat /etc/passwd |grep 422
|070615 00:10:59|  cat /etc/passwd |grep 622
|070615 00:11:57|  history -100|grep rm
|070615 00:11:57|  history -100|grep rm
{b=$2}是匹配前赋值,还是匹配后赋值呢,怎么赋值的呢
哪位达人给说说啊

论坛徽章:
0
8 [报告]
发表于 2007-08-08 09:07 |只看该作者
ls已经完成一半操作了 接下来就是什么时候把"b"印出来

论坛徽章:
0
9 [报告]
发表于 2007-08-08 09:34 |只看该作者
awk '{if($3!="exit"){print;a=1}else if(a) {print $1,$2,"special";a=0;}}' 1.txt

论坛徽章:
0
10 [报告]
发表于 2007-08-08 09:43 |只看该作者
原帖由 davistar 于 2007-8-7 16:14 发表

awk -F\| '{
                 if($3~/exit/)
                 {
                    b=$2
                 }
                 else
                 {
                    if(b != ""){print $0;print "|"b"|  specific";b=""}
                    else{print $0}
                 }
              }
              END{print "|"b"|  specific"}' urfile



以|为分隔符,
如果第三个域匹配exit,则变量b赋值为本行第二个域的内容(即时间),不打印任何内容,接着处理下一行;
如果第三个域不匹配exit且变量b不为空(即已被赋过值,也就是前最后一个含exit行的第二个域),则先打印本行,接着打印|b的值| specific,再将b置空,接着处理下一行;
如果第三个域不匹配exit且变量b为空,则打印本行,接着处理下一行。




红色部分似乎有顺序问题,两个print应该倒一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP