免费注册 查看新帖 |

Chinaunix

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

大侠们再求个复杂点的sed或awk [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-06 13:25 |只看该作者 |倒序浏览
5可用积分
本帖最后由 waily 于 2011-12-06 14:12 编辑

文本中有大量的这样的行,而且里面的时间是国际标准时间,比我们的北京时间小8个小时
  1. leases 192.168.0.1 {
  2. start 4 2011/12/07 04:41:18;
  3. ends 4 2011/12/07 04:41:18;
  4. ......
  5. }
  6. leases 192.168.0.1 {
  7. start 4 2011/12/08 04:41:18;
  8. ends 4 2011/12/08 04:41:18;
  9. ......
  10. }
  11. leases 192.168.0.2 {
  12. start 4 2011/12/08 04:41:18;
  13. ends 4 2011/12/08 04:41:18;
  14. ......
  15. }
复制代码
省略号意思是此处行数从1~5不定

求个awk或sed统计含ends且该行时间转成北京时间后大于当前北京时间的总行数,但ip地址一样的只能按最后一次出现的ends来比对,比如上面的192.168.0.1出现2次,因此只能从第2次出现中提取ends进行时间比较。

最佳答案

论坛徽章:
0
2 [报告]
发表于 2011-12-06 13:25 |只看该作者
借花献佛
  1. awk -F'[ \n]+' -v d="$(TZ=GMT date +'%Y/%m/%d %T;')" -v RS="\n}\n" '!a[$2]++{for(i=1;i<=NF;i++)if($i~/^ends$/&&$(i+2)" "$(i+3)>d)n++}END{print n}' file
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-12-06 14:30 |只看该作者
我现在的思路是
用sed把
leases 192.168.0.2 {
start 4 2011/12/08 04:41:18;
ends 4 2011/12/08 04:41:18;

这3行整成一行,然后排重只剩下最后一行,然后用waker在前一帖中的方法来awk

不知道咋写,也不知道有没有更好的思路

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2011-12-06 14:36 |只看该作者
leases 192.168.0.1 {
start 4 2011/12/08 04:41:18;
ends 4 2011/12/08 04:41:18;

如果这三行和字段的顺序都是固定的,你只要设置RS为"}",查好要比较的是第几个字段就行了

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
5 [报告]
发表于 2011-12-06 14:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2011-12-06 15:18 |只看该作者
回复 3# waker


    shit,我是猪脑,还是歪壳脑袋瓜好使

同时感谢其他各位

论坛徽章:
0
7 [报告]
发表于 2011-12-06 15:40 |只看该作者
本帖最后由 MeaCulpa 于 2011-12-06 16:01 编辑

时间比较没那么简单吧?

不相信bash, 不相信gnuawk, 不相信Linux. 我只相信unix sort.
  1. #!/bin/env sh
  2. curdate="$(TZ=GMT date +'%Y/%m/%d %T;')"
  3. awk -v pat="$curdate" '
  4. BEGIN { print "cur:",pat;}
  5. /^leases/ {ip = $2;}
  6. /^ends/ {set[ip] = sprintf("%s %s", $3, $4);}
  7. END { for (i in set) print "data:",set[i];}
  8. ' $1 | sort -k2 | awk '
  9. /cur/ { output=1; next;}
  10. output { print;}
  11. ' | cut -d' ' -f2-
复制代码
sort 参数可以推敲。需要算行数的话,把cut换成wc -l

论坛徽章:
0
8 [报告]
发表于 2011-12-06 19:49 |只看该作者
回复 7# MeaCulpa


    谢谢

论坛徽章:
0
9 [报告]
发表于 2011-12-06 21:12 |只看该作者
回复 1# waily


    晕,答案不对,看错了,以为是按第一次出现的计算
这个应该没问题了
  1. awk -F'[ \n]+' -v d="$(TZ=GMT date +'%Y/%m/%d %T;')" -v RS="\n}\n" '$8~/^ends/{if($10" "$11 >d)a[$2];else delete a[$2]}END{print asort(a)}' file
复制代码

论坛徽章:
0
10 [报告]
发表于 2011-12-07 14:31 |只看该作者
回复 9# where27

多谢热情指导
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP