免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求shell按列排序去重代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-03-23 15:19 |显示全部楼层 |倒序浏览
原始文件为一日志文件,用cat 和grep过滤指定关键字后数据格式为:
Mar 20 09:00:20 LOG xxxx: GOT INFO: ip 192.168.1.91 to client with mac 00:01:00:27:b1:a7 ab = 12 valid 100 ms
Mar 20 09:02:07 LOG xxxx: GOT INFO: ip 192.168.1.12 to client with mac 00:01:00:f5:41:ba ab = 14 bad
Mar 20 09:13:20 LOG xxxx: GOT INFO: ip 192.168.1.19 to client with mac 00:01:00:e1:78:38 ab = 15 valid 120 ms

Mar 20 09:24:39 LOG xxxx: GOT INFO: ip 192.168.1.91 to client with mac 00:01:00:27:b1:a7 ab = 12 valid 90 ms
Mar 20 09:33:37 LOG xxxx: GOT INFO: ip 192.168.1.11 to client with mac 00:01:00:f5:41:ba ab = 143 bad
Mar 20 09:35:38 LOG xxxx: GOT INFO: ip 192.168.1.12 to client with mac 00:01:00:f5:41:ba ab = 15 valid 220 ms
Mar 20 09:36:37 LOG xxxx: GOT INFO: ip 192.168.1.11 to client with mac 00:01:00:f5:41:bb ab = 13 bad



需要实现的目标是:
1.首先根据mac地址和时间排序去重,即相同mac地址不同时间的日志,只留下最后一个时间的


2.对前面3列自动补充本年的年份后转为unix时间戳
3.对最后面的状态位如果是bad的,输出bad,如果是valid的,只输出ms数
4.最后按照时间的unix时间戳进行升序排列


以以上日志为例,应该输出:
(2018/3/20 09:24:39的unix时间戳) 192.168.1.91 00:01:00:27:b1:a7 valid 90
(2018/3/20 09:35:38的unix时间戳) 192.168.1.12 00:01:00:f5:41:ba valid 220
(2018/3/20 09:36:37的unix时间戳) 192.168.1.11 00:01:00:f5:41:bb bad



论坛徽章:
0
2 [报告]
发表于 2018-03-23 16:26 |显示全部楼层
本帖最后由 zbs168 于 2018-03-23 16:35 编辑

结贴,感谢楼上两位大牛实地跑数据测试得知:

2楼的wh7211
real        0m0.023s
user        0m0.013s
sys        0m0.010s


3楼的reyleon
real        0m5.825s
user        0m0.023s
sys        0m0.163s


论坛徽章:
0
3 [报告]
发表于 2018-03-23 16:41 |显示全部楼层
本帖最后由 zbs168 于 2018-03-23 16:48 编辑

谢谢

论坛徽章:
0
4 [报告]
发表于 2018-03-23 17:12 |显示全部楼层
本帖最后由 zbs168 于 2018-03-23 17:18 编辑

论坛秀逗了,请看第10楼

论坛徽章:
0
5 [报告]
发表于 2018-03-23 17:15 |显示全部楼层
本帖最后由 zbs168 于 2018-03-23 17:18 编辑

论坛秀逗了,请看第10楼

论坛徽章:
0
6 [报告]
发表于 2018-03-23 17:16 |显示全部楼层
本帖最后由 zbs168 于 2018-03-23 17:29 编辑

回复 7# wh7211

谢谢优化,但是有个问题Mar 20 09:24:39 LOG xxxx: GOT INFO: ip 192.168.1.91 to client with mac 00:01:00:27:b1:a7 ab = 12 valid 90 ms
例如这行中的mac:00:01:00:27:b1:a7,实际为可变长度,可能是6位,也可能是12位,也可能是任意位
我用
  1. awk '$0!~/^$/{y=strftime("%Y",systime());m=$1=="Jan"?1:$1=="Feb"?2:$1=="Mar"?3:$1=="Apr"?4:$1=="May"?5:$1=="Jun"?6:$1=="Jul"?7:$1=="Aug"?8:$1=="Sep"?9:$1=="Oct"?10:$1=="Nov"?11:$1=="Dec"?12:"";split($3,a,":");b=mktime(""y" "m" "$2" "a[1]" "a[2]" "a[3]"");c=$18=="valid"?$18" "$19+b:$18;d[$14]=b" "$9" "$14" "c}END{PROCINFO["sorted_in"]="@val_num_asc";for(i in d){print d[i]}}' 1
复制代码


得到的数据是:
1521508400 192.168.1.19 00:01:00:e1:78:38 valid 1521508520
1521509079 192.168.1.91 00:01:00:27:b1:a7 valid 1521509169
1521509738 192.168.1.12 00:01:00:f5:41:ba valid 1521509958
1521509797 192.168.1.11 00:01:00:f5:41:bb bad



同时,新问题是:
我每次处理完后会把结果用>>汇总到文件a.txt里面,每隔5分钟跑一次,我想每次汇总完后对a.txt进行二次过滤,过滤要求是:
1.根据mac进行排序,相同mac重复的数据只保留日期最近的一条数据,不同mac无重复的数据保留
2.获取当前的unix时间戳
3.将最后一列的数值与第2步得到的unix时间戳对比,如果小于当前unix时间戳,就抛弃该行,表示过期
4.最后还是按照第一列进行升序排列

论坛徽章:
0
7 [报告]
发表于 2018-03-24 20:11 |显示全部楼层
回复 11# wh7211

能否私信给个qq一类的,我把文件给您发过去,麻烦您给看看,好像还是不行

论坛徽章:
0
8 [报告]
发表于 2018-03-25 16:53 |显示全部楼层
回复 13# wh7211

55555555555555555,这就是最悲催的事情,我的用户组发不了私信。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP