免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lightning
打印 上一主题 下一主题

[文本处理] 求一个思路,一个文件拆分后的思路 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-09-19 13:09 |只看该作者
楼主:有多少个多少个键是确定的么?
这些键=值对儿在第记录中的顺序是确定的么?
结果中的顺序又是什么样的 ...
waker 发表于 2011-09-19 11:08


     有多少个键确定的,30多个,键的顺序不能确定,因为不同的日志类型他的键值位置不一样。  结果顺序我自己定了一个顺序,也确定的。就是我之前脚本里有显示,下面我把所有键值列出来:

echo $HOSTNAME,$LOCAL_TIME,$action,$AppId,$appID,$itemID,$price,$prevPrice,$prePay,$PkgId,$license,$repeat,$msgID,$SC,$AP,$ID,$AS,$RID,$FWR,$CID,$IN,$CP,$RND,$N,$CLD,$LN,$IID,$ST,$PL,$TZ,$DN,$DIF,$RAWAPI,$AUTH,$API,$PLAT,$LANGUAGE,$CARRIER,$RAND,$time,$HASH,$hw,$txid,$catId,$RETURNS,$status,$AUTHSCHEME >> $LOG_FILE

论坛徽章:
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
22 [报告]
发表于 2011-09-19 14:04 |只看该作者
有多少个键确定的,30多个,键的顺序不能确定,因为不同的日志类型他的键值位置不一样。  结果顺序 ...
lightning 发表于 2011-09-19 13:09


#自己设...
#t=多少个键
#键太多了自己设...  a["键名"] = 键位  

$ awk -F'[]=; &[]+' 'BEGIN{t=50;a["action"]=2;a["AppId"]=3;a["appID"]=4;a["AP"]=14}{delete b;b[1]=$2" "$3" "$4;for(n=1;n++<tif(a[$n]!=""b[a[$n]]=$(n+1);for(n=0;n++<tprintf b[n]",";print""}' log1 log3
15/09/2011 01:28:38:613 CST,userAuth,,,,,,,,,,,,3.1.5.167,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
15/09/2011 01:28:39:694 CST,userAuth,,,,,,,,,,,,3.1.5.145,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
15/09/2011 22:42:55:654 CST,getMsg,,,,,,,,,,,,3.1.5.145,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
15/09/2011 06:27:23:811 CST,msgPkgDeleteACK,,12831713,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
15/09/2011 06:27:24:708 CST,msgPkgDeleteACK,,13066620,,,,,,,,,,3.1.5.186,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
15/09/2011 06:27:25:862 CST,msgPkgDeleteACK,,13066620,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

论坛徽章:
0
23 [报告]
发表于 2011-09-19 15:05 |只看该作者
#自己设...
#t=多少个键
#键太多了自己设...  a["键名"] = 键位  

$ awk -F'[]=; &[]+' 'BEGIN{t= ...
jason680 发表于 2011-09-19 14:04



    感谢,能在linux 上执行了,能否详细讲解一下你的语句,我想学习一下,这个要比我原来的方法简单很多啊。
               谢谢了,虽然solaris 上面好像有问题,但我可以慢慢琢磨

论坛徽章:
0
24 [报告]
发表于 2011-09-19 15:09 |只看该作者
感谢,能在linux 上执行了,能否详细讲解一下你的语句,我想学习一下,这个要比我原来的方法简单 ...
lightning 发表于 2011-09-19 15:05



    returns 这个特殊的值好像没有,看来的另外想办法了

论坛徽章:
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
25 [报告]
发表于 2011-09-19 15:13 |只看该作者
感谢,能在linux 上执行了,能否详细讲解一下你的语句,我想学习一下,这个要比我原来的方法简单 ...
lightning 发表于 2011-09-19 15:05


说说看...那不明白...

论坛徽章:
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
26 [报告]
发表于 2011-09-19 15:16 |只看该作者
returns 这个特殊的值好像没有,看来的另外想办法了
lightning 发表于 2011-09-19 15:09



returns...有值,你没设好吗? a["returns"]=XX

论坛徽章:
0
27 [报告]
发表于 2011-09-19 15:35 |只看该作者
returns...有值,你没设好吗? a["returns"]=XX
jason680 发表于 2011-09-19 15:16



    有两个值帮忙看看如何加入进去,第一个是hostname 想放在第一列,按照你写的感觉需要设定 b[1]=$HOSTNAME 但是这个写法不成立,不能调用外部的变量。returns 这个值在日志中不是以“等于”开头的,他是一个列 日志中显示为 returns 200 或者  returns 401  所以这个值 我想是否可以和你去日期值得方法一样,将b[37]=$11 这样写?


不太理解的,主要是 awk -F'[]=; &[]+'  和 if(a[$n]!=""b[a[$n]]=$(n+1);for(n=0;n++<t

第一段 -F  不是用来 指定分割符的吗?这里你是指定了2个嘛?

第二段 意思是不是 当a[1] 不为空的时候 执行 b[a[1]]=$(1+1)  但执行的这一段我不太理解你怎么读取 a[1-50] 中的值

论坛徽章:
0
28 [报告]
发表于 2011-09-19 15:38 |只看该作者
有两个值帮忙看看如何加入进去,第一个是hostname 想放在第一列,按照你写的感觉需要设定 b[1]=$ ...
lightning 发表于 2011-09-19 15:35



    还有就是 solais 下好像不认 delete b; 有什么可以代替吗

nawk: you can only delete array[element] at source line 1
context is
        BEGIN{t=50;a["action"]=2;a["AppId"]=3;a["appID"]=4;a["AP"]=14}{delete >>>  b; <<<
nawk: syntax error at source line 1
nawk: illegal statement at source line 1

论坛徽章:
0
29 [报告]
发表于 2011-09-19 15:58 |只看该作者
说说看...那不明白...
jason680 发表于 2011-09-19 15:13



    还有就是 t 这个值 如何设定,比如我有 7个值,但是我写 t=8 无法显示出完整的7个值 比如要写到10才能显示,这是什么原因?

论坛徽章:
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
30 [报告]
发表于 2011-09-19 16:13 |只看该作者
本帖最后由 jason680 于 2011-09-19 16:17 编辑
有两个值帮忙看看如何加入进去,第一个是hostname 想放在第一列,按照你写的感觉需要设定 b[1]=$ ...
lightning 发表于 2011-09-19 15:35



>> 有两个值帮忙看看如何加入进去,第一个是hostname 想放在第一列,按照你写的感觉需要设定b[1]=$HOSTNAME 但是这个写法不成立,不能调用外部的变量。
Ans: 除非你(13楼)须求写错....要不然何来hostname?

13楼须求:
>>第一类日志经过处理后,需要得出如下记录:
>>15/09/2011 01:28:38:613 CST,userAuth,,,,,,,,,,,,3.1.5.167,7...
这没看到你说的hostname,以你所设方式,就算没有得到hostname,也应该空值

这样才有hostname
,15/09/2011 01:28:38:613 CST,userAuth,,,,,,,,,,,,3.1.5.167,7...
(注:以上hostname为空值,永远在第一列)

这就是15楼"狗哥"说的挤牙膏(须求前后不一,一直改........)
>>回复 14# lightning
>>但愿楼主不要挤牙膏

=================================
awk ... for(n=0;n++<t​​ ...
加入
awk -v hn="$HOSTNAME" ... printf hn",";for(n=0;n++<t​​ ...
=================================

>> 不太理解的,主要是awk -F'[]=; &[]+' 和if(a[$n]!=""b[a[$n]]=$(n+1) ;for(n=0;n++<t​​

>> 第一段-F 不是用来指定分割符的吗?这里你是指定了2个嘛?
Ans:
第一类日志:
/abc/aaa_09152011:[15/09/2011 01:28:38:613 CST] ... action=userAuth is [AP=3.1.5.167;ID=710036098;...
分格符有 = [ ] 空白 ;

第三类数据
/abc/aaa_09152011:[15/09/2011 06:27:23:811 CST] ... action=msgPkgDeleteACK&appID=12831713&price=455...
分格符有 = [ ] 空白 &

全部为分格符 = [ ] 空白 ; &
用awk 写出来就是-F'[]=; &[]+' (最后的一个+加号,表示一个以上)
因为含有特别符[ ], 一定写成 awk -F'[]xxx[]' 型式...


>> 第二段意思是不是当a[1] 不为空的时候执行b[a[1]]=$(1+1) 但执行的这一段我不太理解你怎么读取a[1- 50] 中的值
Ans:
这是这个code的重点...
if(a[$n]!=""b[a[$n]]=$(n+1);for(n=0;n++<t​​
以 ... action=userAuth ...
不管action 是 $20 或 $25
userAuth都是下一个 $21 或 $26

if(a[$n]!="" ==> if(a["action"]!=""  ==> if(2 != "" ==> true
action为我们所要之"键名",则下一个就是所要之"键值"...
b[a[$n]] = $(n+1)
==>b[a["action"]] = "userAuth"
a["action"]=2,得
==>b[2] = "userAuth"

最后收集....
b[1] = "15/09/2011 01:28:38:613 CST"
b[2] = "userAuth"
b[3] = ...

最后for 打印出b[1],b[2], ...b[50]   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP