awk等命令处理文本日志[数据]工作记录两则

刚才为了选全站分类,寻找了小分钟。想来静心写写工作笔记,发篇blog还是挺麻烦,尤其对我这个懒人。为了子文为了坚持,忍耐下吧。
下面的文字,是小申工作的笔记。处理文本log的两次记录,备忘以后方便查询。这块我是刚入门的同学,应用也比较简单,高手看到之后,多多指教。

1、处理一:
[quote]
数据文件一:log_1.txt
[2010-03-04 07:29:02] [30789][visit:g.php][use:1101]
[2010-03-04 07:29:02] [474330][visit:g.php][use:1001]
[2010-03-04 07:29:02] [57159][visit:g.php][use:10201]
……n+1条
[时间] [用户id][visit:g.php][use:访问时候的参数]

[/quote]
分别是要提取“用户id”和“访问时候的参数”,这两项。
处理:这里用 awk[url]http://www.linux.gov.cn/shell/awk.htm[/url]来处理。
用到awk中 (-F)这个参数:
a、单独提取用户id:

~$:awk -F' \\[' '{printf( int($2)"\n")}' log_1.txt>ret_1.txt
or:
~$:awk -F'[' '{printf( int($3)"\n")}' log_1.txt>ret_1.txt

解释:命令一使用' '空格加'['做分隔符号,在'['前加上两个'\\'转一下。
命令二直接使用'[',所以打印的时候,打印的是 $3,
b、单独提取用户携带的参数,用'use:'做参数就可以了。
c、同时提取,多次使用awk,如:

~$:awk -F'\\]\\[visit:get.php\\]\\[use:' '{printf($1" "int($2)"\n")}' log_1.txt|awk -F' \\[' '{printf($2"\n")}'|head

总结三点:
a、awk的 -F 参数,一些特殊符号,用两个'\\'转。
b、处理部分,'{printf($1" "int($2)"\n")}',外面单引号,里面双引号。系统变量用单引号括起来,双引号被解释成是字符串。(不一定正确,但不会报错,哈哈),里面的内置函数 int()等,更多函数可以google awk 内置函数。
c、对于printf(),其实括号也可以不要的。里面的格式,用字符串拼凑:($1" "int($2)"\n"),也可以用c那种("%d\n",$2)。看怎么样方便。
2、处理二:
[quote]
log数据二:log_2.txt
10002 2010-01-09 15:08:16
10013 2010-01-21 11:55:34
10075 2010-01-28 16:22:54
……
格式:【用户id 年-月-日 时-分-秒】
[/quote]
做什么呢,不急,这是用户参与A活动的数据,这里还有第二份数据——用户参与B活动的数据。但在orale里面,
要求对比出提取出先参与活动A在参与B,或者是先参与B在参与A的两分用户id数据(用户可以多次参与活动)。

to do:
a、从orale里面导出数据:
[quote]
~$:sqlplus 服务器/用户名@密码
sql: set heading off;
sql: set trimout on;
sql: set trimspool on;
sql: set feedback off;
spool 最终生成的文件;//这里我们得到 'log_3.txt'
说明可以看看这里 [url]http://xsb.itpub.net/post/419/49511[/url]
[/quote]
在接下来的命令中输入sql语句,这里没有什么好注意的,orale中,几个用在sql中的函数很有用,比如,这里,我们有一个字段是时间的,在orale以内部时间来储存,我们要到处为固定格式,可以用to_char()函数,我们这里在数据库里面的时间字段为timestamp。那么
[quote]
sql:
select distinct uid,[color=red]to_char[/color]( timestamp, 'YYYY-MM-DD HH24:MI:SS' ) from ……
[/quote]
这样,得到一份和log_2.txt一样的log文件。
b、对于,log_3.txt,有需要处理的部分,如,前面的sql语句和中间的空行,可以用下面的语句去除空行

~$:sed '/^$/d' file
or_~$:awk '/./ {print}' file
or_~$:grep -v '^$' file

c、对于 log_2.txt和log_3.txt 因为用户可以多次参与活动,我们要做的是排序去重。

~$:sort -d file|uniq>file_ret

d、现在文件,排好续了,用jion可以把两个文件重合的部分得出来。但如何比较时间呢。之前我的想法是把文件中时间按部分转化为时间戳。但尝试了下,有点麻烦,没有现成的函数。倒是awk中,在printf的时候,用 strftime("%Y%m%d",$n)把时间戳转化为格式化字符串,反过来有点麻烦,请有经验的同学,指导一下。最后的做法是直接对比时间那两个字符串,awk提供字符串直接对比。
[quote]
格式:【用户id 年-月-日 时-分-秒】
[/quote]
因为时间中间用空格分开了,比较的时候有点麻烦,先awk一下,把两个字符段,连接起来。

~$:awk '{printf("%s %s_%s\n",$1,$2,$3)}' file

在jion就能得到这样的文件了
[quote]
2079 2010-02-02_12:14:55 2010-01-28_10:40:12
2090 2010-02-15_20:06:28 2010-02-01_20:50:32
2091 2010-03-05_16:38:59 2010-02-18_03:27:44
[/quote]
e、最后在执行比较的操作:

~$:awk '{if($2>$3)printf($0"\n")}' file>last_file


感觉没有什么好总结的了,记着备忘。
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值