免费注册 查看新帖 |

Chinaunix

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

达人过来看看,日志文本如何处理? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-11 14:17 |只看该作者 |倒序浏览
本帖最后由 moshangxie 于 2011-09-14 09:35 编辑
  1. Sun Jan 31 00:00:01 2010
  2.         User-Name = "test0023"
  3.         NAS-Port = 17827544
  4.         NAS-IP-Address = 10.60.255.1
  5.         Framed-IP-Address = 10.72.3.127
  6.         NAS-Identifier = "TEST"
  7.         Acct-Status-Type = Stop
  8.         Acct-Delay-Time = 0
  9.         Acct-Input-Octets = 320782848
  10.         Acct-Output-Octets = 1110648668
  11.         Acct-Session-Id = "TEST01100000001752ed887723033"
  12.         Acct-Authentic = RADIUS
  13.         Acct-Session-Time = 26110
  14.         Acct-Input-Packets = 1190968
  15.         Acct-Output-Packets = 1213428
  16.         Acct-Terminate-Cause = User-Request
  17.         Acct-Input-Gigawords = 0
  18.         Acct-Output-Gigawords = 0
  19.         Event-Timestamp = "Jan 31 2010 07:45:43 EAT"
  20.         NAS-Port-Type = Ethernet
  21.         Calling-Station-Id = "00:02:3f:07:48:11"
  22.         NAS-Port-Id = "slot=1;subslot=1;port=0;vlanid=1752;"
  23.         Acct-Tunnel-Packets-Lost = 0
  24.         Service-Type = Framed-User
  25.         Framed-Protocol = PPP
  26.         SK-Attr-60 = 0x31302e37322e332e3132372030303a30323a33663a30373a34383a3131
  27.         SK_Input_Peak_Rate = 1048576
  28.         SK_Input_Average_Rate = 1048576
  29.         SK_Out_Peak_Rate = 10485760
  30.         SK_Out_Average_Rate = 10485760
  31.         SK-Attr-22 = 0x00000000
  32.         SK-Attr-26 = 0x000059f9
  33.         SK-Attr-138 = 0x71696e6764616f6d656469612e636f6d
  34.         Client-IP-Address = 10.60.255.1
  35.         Acct-Unique-Session-Id = "3b3c5639bdf52982"
  36.         Timestamp = 1264867201

  37. Sun Jan 31 00:00:02 2010
  38.         User-Name = "test0013"
  39.         NAS-Port = 17827764
  40.         NAS-IP-Address = 10.60.255.1
  41.         Framed-IP-Address = 10.72.1.131
  42.         NAS-Identifier = "TEST"
  43.         Acct-Status-Type = Start
  44.         Acct-Delay-Time = 0
  45.         Acct-Session-Id = "TEST011000000019720ed8f624654"
  46.         Acct-Authentic = RADIUS
  47.         Event-Timestamp = "Jan 31 2010 07:45:44 EAT"
  48.         NAS-Port-Type = Ethernet
  49.         Calling-Station-Id = "00:10:5c:e8:77:a4"
  50.         NAS-Port-Id = "slot=1;subslot=1;port=0;vlanid=1972;"
  51.         Acct-Tunnel-Packets-Lost = 0
  52.         Service-Type = Framed-User
  53.         Framed-Protocol = PPP
  54.         SK-Attr-60 = 0x31302e37322e312e3133312030303a31303a35633a65383a37373a6134
  55.         SK_Input_Peak_Rate = 1048576
  56.         SK_Input_Average_Rate = 1048576
  57.         SK_Out_Peak_Rate = 10485760
  58.         SK_Out_Average_Rate = 10485760
  59.         SK-Attr-22 = 0x00000000
  60.         SK-Attr-26 = 0x0000604e
  61.         SK-Attr-138 = 0x71696e6764616f6d656469612e636f6d
  62.         Client-IP-Address = 10.60.255.1
  63.         Acct-Unique-Session-Id = "2c32637ece099079"
  64.         Timestamp = 1264867202
复制代码
要获取User-Name,Framed-IP-Address,NAS-Identifier,Acct-Status-Type,Acct-Session-Time,
Calling-Station-Id,Acct-Unique-Session-Id,Timestamp的值,如果行中没有Acct-Session-Tim则将该值补为0,即得到如下结果:

  1. test0023  10.72.3.127  TEST  Stop  26110   00:02:3f:07:48:11   3b3c5639bdf52982   2010-01-31 00:00:01
  2. test0013  10.72.1.131  TEST  Start   0          00:10:5c:e8:77:a4   2c32637ece099079  2010-01-31 00:00:02
复制代码
请问如何实现?

如果上述结果中Acct-Unique-Session-Id后再增加一列 (Timestamp -Acct-Session-Time )的值,并将值以日期时间格式显示,即:


  1. test0023  10.72.3.127  TEST  Stop  26110   00:02:3f:07:48:11   3b3c5639bdf52982  2010-01-30 16:44:51 2010-01-31 00:00:01
  2. test0013  10.72.1.131  TEST  Start   0          00:10:5c:e8:77:a4   2c32637ece099079 2010-01-31 00:00:02  2010-01-31 00:00:02
复制代码
请问如何实现?

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2011-09-11 15:21 |只看该作者
本帖最后由 yinyuemi 于 2011-09-11 15:26 编辑
  1. awk '/^[^ ]/{X=$0}/User-Name/{gsub("\"","",$NF);T=$NF}/Framed-IP-Address/{T=T FS $NF}/NAS-Identifier/{gsub("\"","",$NF);T=T FS $NF}/Acct-Status-Type/{T=T FS $NF;S=""}/Acct-Session-Time/{S=$NF;T=T FS $NF}/Calling-Station-Id/{gsub("\"","",$NF);T=length(S)?T FS $NF:T FS "0" FS $NF}/Acct-Unique-Session-Id/{gsub("\"","",$NF);T=T FS $NF}/ Timestamp/{cmd="date -d \""X"\" \"+%Y-%m-%d %T\"";cmd|getline line;print T FS line;close(cmd)}' file
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-09-11 15:29 |只看该作者
本帖最后由 moshangxie 于 2011-09-11 15:44 编辑

回复 2# yinyuemi


   不知道您的脚本在本机上测试通过了没有, 在我的机器上运行您的脚本,可什么都没有输出。

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

论坛徽章:
0
5 [报告]
发表于 2011-09-11 16:16 |只看该作者
回复 4# zooyo


    awk -W version
GNU Awk 3.1.3

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2011-09-11 16:17 |只看该作者
要获取User-Name,Framed-IP-Address,NAS-Identifier,Acct-Status-Type,Acct-Session-Time,
Calling-S ...
moshangxie 发表于 2011-09-11 14:17



$ awk -F'[=\t "]+' 'BEGIN{a["User-Name"]=1;a["Framed-IP-Address"]=2;a["NAS-Identifier"]=3;a["Acct-Status-Type"]=4;a["Acct-Session-Time"]=5;a["Calling-Station-Id"]=6;a["Acct-Unique-Session-Id"]=7}{if($2=="Timestamp"{for(n=0;n++<7printf b[n]==""?0"\t":b[n]"\t";print strftime("%F %T",$3);delete b}if(a[$2]!=0)b[a[$2]]=$3}' LOG
test0023        10.72.3.127        TEST        Stop        26110        00:02:3f:07:48:11        3b3c5639bdf52982        2010-01-31 00:00:01
test0013        10.72.1.131        TEST        Start        0        00:10:5c:e8:77:a4        2c32637ece099079        2010-01-31 00:00:02

论坛徽章:
0
7 [报告]
发表于 2011-09-11 16:21 |只看该作者
回复 6# jason680


    谢谢老师,太牛了!!!!

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
8 [报告]
发表于 2011-09-11 17:38 |只看该作者
mark

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
9 [报告]
发表于 2011-09-11 23:08 |只看该作者
本帖最后由 yinyuemi 于 2011-09-11 23:10 编辑

回复 3# moshangxie


   测试过的:
  1. awk '/^[^ ]/{X=$0}/User-Name/{gsub("\"","",$NF);T=$NF}/Framed-IP-Address/{T=T FS $NF}/NAS-Identifier/{gsub("\"","",$NF);T=T FS $NF}/Acct-Status-Type/{T=T FS $NF;S=""}/Acct-Session-Time/{S=$NF;T=T FS $NF}/Calling-Station-Id/{gsub("\"","",$NF);T=length(S)?T FS $NF:T FS "0" FS $NF}/Acct-Unique-Session-Id/{gsub("\"","",$NF);T=T FS $NF}/ Timestamp/{cmd="date -d \""X"\" \"+%Y-%m-%d %T\"";cmd|getline line;print T FS line}' dar |column -t
  2. test0023  10.72.3.127  TEST  Stop   26110  00:02:3f:07:48:11  3b3c5639bdf52982  2010-01-31  00:00:01
  3. test0013  10.72.1.131  TEST  Start  0      00:10:5c:e8:77:a4  2c32637ece099079  2010-01-31  00:00:02
复制代码
有两个地方可能,会导致代码出错,
1./^[^ ]/{X=$0},可以改成$NF~/^[0-9][0-9][0-9][0-9]$/{X=$0}
2./ Timestamp/{...} ,可以改为 $1=="\"Timestamp\""{...}

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
10 [报告]
发表于 2011-09-12 09:54 |只看该作者
  1. awk 'BEGIN{RS="";FS="\n"; l=split("User-Name,Framed-IP-Address,NAS-Identifier,Acct-Status-Type,Acct-Session-Time,Calling-Station-Id,Acct-Unique-Session-Id,Timestamp",key,",")}
  2. {for (i=1;i<=NF;i++)
  3.      {    gsub(/ |"/,"");
  4.            split($i,a,"=");b[a[1]]=a[2];
  5.            if (a[1]=="Timestamp") b[a[1]]=sprintf(strftime("%F %T",a[2]))
  6.      }
  7. }
  8. {for (i=1;i<=l;i++) printf b[key[i]]?b[key[i]] OFS:"0" OFS;printf ORS;delete a;delete b}' OFS="\t" infile
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP