LinuxSir.Org  
| 网站首页 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
精华主题  
主题工具
旧 04-04-11, 21:32 第 16 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

呵呵,只是就正常的日志逻辑,在下猜想而已。r2007兄教训的是。







__________________
IBOX, a LiveCD distribution based on Gentoo, is fit for newbie.

IBOX brings to you:
- knoppix-style harddisk installation tool, by which you can install Gentoo in 20 minutes.
- hardware auto-configuration. You can run into X desktop directly.
- all-round software set, including OpenOffice, azureus.
- LiveCD-create-tools. Step-by-step, custom a LiveCD yourself with ease.

Any questions and feedbacks is welcome to home_king at 163 dot com
  home_king 当前离线   回复时引用此帖
旧 04-04-12, 10:33 第 17 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,576
  精华: 9
 

非常感谢home_king和r2007两位高手对此问题的深入研究!!!!!连我真的都没有想到这样的深度。原来是因为同事对其中PARSING_FAILED的内容要求的急,我也没有仔细的查看这个log文件的逻辑。看了两位对这个问题的分析后,我也认真的看了一下此log文件的特征(这个log有100000多行,为了不漏掉一些特殊的地方,看了整整2个小时,看到我流眼泪,现给出此文件的通项结构: (由于是程序生成的log文件,内容还算是很工整的。)
-----------------------------------------------------------
(文件最开头的空格)
1~Procoess ID ~UnixTimeFormat(Human Readable Time)
### EVENT ###
Contents (no blank new line. Could be multiple lines.)
(BLANK NEW LINE as the separator)
### END EVENT ###
Receiptor Action (Only have two values: PROCESSED or PARSING_FAILED)
(BLANK NEW LINE as the separator)
-------------------------------------------------------------
根据以上的通项,可以给出两个通项的列子(非真实数据):
---------------------------------------------------

1~906098~4345678(Apr 09 20:03:59 2004)
### EVENT ###
eihvtkv
euiaek=1aee
eiiiovn="kwioeir3ad"
lcbjieio

### END EVENT ###
PROCESSED

1~906099~458748239(Apr 08 21:33:45 2004)
### EVENT ###
kdieiejr
jkjviej
eeku3="wefa1f3"
kl843fkl3="lsdjfirenvksndvir"
kwei3
klvjlkjq

### END EVENT ###
PARSING_FAILED

------------------------------------------------------------
这样的话,有几点就清楚了:
1。 时间戳的格式是固定的。一定是 “1~Process ID~UnixTimeFormat(Human Readable Time)
至于为什么是"1~"开头,我也不清楚。
2. EVENT的内容的长度,即Contents 的行数不是固定的。但是肯定没有空行。
3. "### END EVENT ###"前是肯定有空行的。
4. "### END EVENT ###"之后的字串只有两种可能: PROCESS or PARSING_FAILED.
5. 教主说的”域间分布不均匀性“是客观存在。(真对不起,最先的列子看不到这一点。)因为EVENT log中的PROCESSED和PARSING_FAILED是随机的,处理成了就是PROCESSED, 没有成功就是PARSING_FAILED. 所以它们出现的次序是无序的。
5.关于最后的一个空行的问题,因为我没有看到构造程序的源码,所以我不能确定,但是我认为最大可能是这个空行包括在了每一个EVENT生成的那段脚本中。,因为这是一个无限append的log文件,当时看到的只是那个时间点的EOF。
不知我是否解释了两位的一些疑点。shell版的学术研究氛围很浓,多得象两位这样的高人带动。在下受益匪浅!多谢多谢!







__________________
15" C2D MBP.
有简单的,不用复杂的!看到复杂的,尽量简单化!
Unix/Linux Philosophy: Be small! Be concentrated! One program does one thing and do it perfectly!
∞ years - 宇宙中最后的物质 Proton heat death. 之后,宇宙将以纯能量的形式永远存在。。。一切皆空
  yongjian 当前离线   回复时引用此帖
旧 04-04-12, 10:47 第 18 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

引用:
最初由 yongjian 发表
-----------------------------------------------------------
(文件最开头的空格)
1~Procoess ID ~UnixTimeFormat(Human Readable Time)
### EVENT ###
Contents (no blank new line. Could be multiple lines.)
(BLANK NEW LINE as the separator)
### END EVENT ###
Receiptor Action (Only have two values: PROCESSED or PARSING_FAILED)
(BLANK NEW LINE as the separator)
-------------------------------------------------------------
和我预想的分析一模一样,呵呵~~~
引用:
这样的话,有几点就清楚了:
1。 时间戳的格式是固定的。一定是 “1~Process ID~UnixTimeFormat(Human Readable Time)
至于为什么是"1~"开头,我也不清楚。
2. EVENT的内容的长度,即Contents 的行数不是固定的。但是肯定没有空行。
3. "### END EVENT ###"前是肯定有空行的。
4. "### END EVENT ###"之后的字串只有两种可能: PROCESS or PARSING_FAILED.
5. 教主说的”域间分布不均匀性“是客观存在。(真对不起,最先的列子看不到这一点。)因为EVENT log中的PROCESSED和PARSING_FAILED是随机的,处理成了就是PROCESSED, 没有成功就是PARSING_FAILED. 所以它们出现的次序是无序的。
5.关于最后的一个空行的问题,因为我没有看到构造程序的源码,所以我不能确定,但是我认为最大可能是这个空行包括在了每一个EVENT生成的那段脚本中。,因为这是一个无限append的log文件,当时看到的只是那个时间点的EOF。
不知我是否解释了两位的一些疑点。shell版的学术研究氛围很浓,多得象两位这样的高人带动。在下受益匪浅!多谢多谢!
我的Gawk最终脚本满足了你所有的要求。正如我说的,它具有灵活性和强壮性。容我道来。
1. 你的时间戳以数字开头,以括号结尾。
代码:
if($0 ~ /^1.*\(.*\)$/) flag=1
我的代码满足这点。
2. 内容行数不是问题,因为我的脚本不是根据这个来过滤的。
3. 至于域间空行,通通都会过滤掉,所以空行的行数无关系。
4. 这两种可能我的脚本都兼顾到,甚至还有扩展性,除了PROCESS or PARSING_FAILED,任意字符串都会被脚本识别。
5. 没错,域间分布不均匀性被脚本解决了。
6. 最后一个空行是无关重要的,如果存在,它总会被我的脚本过滤掉,请看这段巧妙的代码,我是在每个域上根据上下文加入空行的,而非在域下加空行(这有可能造成文件末尾带有空行)
代码:
cnt++ if(cnt>=2) print ""
可见,从第二个域开始,在每个域上面加入空行。

在下的工具观是,sed作为gawk的预处理或者末尾处理工具,而gawk是解决复杂问题的核心工具。

希望兄弟们也要参与这个shell氛围,贡献自己的一份力。在下课业繁重,有时侯兼顾不了。呵呵~~

此帖于 04-04-12 10:56 被 home_king 编辑.
  home_king 当前离线   回复时引用此帖
旧 04-04-13, 11:19 第 19 帖
illusory
 
illusory 的头像
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: DG
  帖子: 20
  精华: 0
 

r2007 DX,看来看去不懂你的代码,能否具体介绍一下吗?
  illusory 当前离线   回复时引用此帖
旧 04-04-13, 17:22 第 20 帖
wire
 
 
 
注册会员  
  注册日期: Mar 2003
  帖子: 40
  精华: 0
 

标题: 我这里用sed另外写了一个


没有嵌套,也许更好理解些:

代码:
cat file | sed -n '/^PROCESSED/{n;h;b};/^PARSING_FAILED/{H;x;p;n;x;b};/./!d;H'

此帖于 04-04-13 17:46 被 wire 编辑.
  wire 当前离线   回复时引用此帖
旧 04-04-13, 21:45 第 21 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,576
  精华: 9
 

引用:
我这里用sed另外写了一个 没有嵌套,也许更好理解些: 源码: cat file | sed -n '/^PROCESSED/{n;h;b};/^PARSING_FAILED/{H;x;p;n;x;b};/./!d;H' 最后由 wire 在 04-13-2004 09:46 编辑
强! 虽然文件头的空行存在,但仅一行代码,值得收藏!
  yongjian 当前离线   回复时引用此帖
旧 04-04-13, 22:02 第 22 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,576
  精华: 9
 

通过应用于真实数据源,wire兄的代码除了首行空行外,完全过滤出了我需要的数据,也解决了域分布不均的问题,不知wire兄是否能解释一下你的代码呢!感谢!
  yongjian 当前离线   回复时引用此帖
旧 04-04-14, 09:58 第 23 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

引用:
最初由 yongjian 发表
通过应用于真实数据源,wire兄的代码除了首行空行外,完全过滤出了我需要的数据,也解决了域分布不均的问题,不知wire兄是否能解释一下你的代码呢!感谢!
那通过应用于真实数据源,在下的gawk脚本工作情况如何?给个反馈好吗?
看来楼主很喜欢"短命令",不过这恰恰是在下的弱项,呵呵~~~我比较注重扩展性。
  home_king 当前离线   回复时引用此帖
旧 04-04-14, 12:18 第 24 帖
wire
 
 
 
注册会员  
  注册日期: Mar 2003
  帖子: 40
  精华: 0
 

这段代码主要是利用sed里的hold space,它可以看作是一个缓冲区;原理其实很简单:sed在处理每行数据时,如遇到PROCESSED时清掉该缓冲,遇到PARSING_FAILED就将缓冲内容打印出来,其它的字符则追加到缓冲里。

首行空行的问题,将代码稍稍修改也可以解决:

代码:
cat file | sed -n '/^PROCESSED/{n;h;b};/^PARSING_FAILED/{H;x;s/^\n//;p;n;h;p;b};/./!d;H'
  wire 当前离线   回复时引用此帖
旧 04-04-14, 16:02 第 25 帖
r2007
 
r2007 的头像
 
 
注册会员  
  注册日期: Jul 2003
  帖子: 166
  精华: 0
 

不同的思路,对代码的复杂程度有很大的影响。
wire的思路
引用:
这段代码主要是利用sed里的hold space,它可以看作是一个缓冲区;原理其实很简单:sed在处理每行数据时,如遇到PROCESSED时清掉该缓冲,遇到PARSING_FAILED就将缓冲内容打印出来,其它的字符则追加到缓冲里。
我的思路是,逐行扫描,当遇到### EVENT ###行时,将其前一行及以后各行保存在pattern space中,直到遇到### END EVENT ###行,然后读取下一行,根据是否是PARSING_FAILED来进行相应的处理。由于最初楼主的描述不能确定能否出现下列情况:
代码:
1~906071~213435245(Apr 08 time 2004) ### EVENT ### aksldlamalsdf PARSING_FAILED asdjalskdfjal ### END EVENT ### PROCESSED something.... 1~906072~458748239(Apr 08 time 2004) ### EVENT ### kdieiejr jkjviej ### END EVENT ### PARSING_FAILED 1~906073~8782293(Apr 08 time 2004) ### EVENT ### ierueio dkjfire ### END EVENT ### PARSING_FAILED
不论如何,我是注重实践的,根据楼主最终的阐述wire的代码相对简单和实用。如工作中果真存在上述情况,再使用更准确的判断方法,当然也更麻烦。
个人观点,请楼主参考。
  r2007 当前离线   回复时引用此帖
旧 04-04-15, 00:00 第 26 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,576
  精华: 9
 

嗯,r2007兄说的很对。我个人认为最重要的是准确!准确的数据输出是很重要的,因为经常的一些数据输出又是要feed到另外的程序中成为数据输入,如果不准确,产生的结果不可想象。在正确的获得数据的基础上,我才考虑代码的复杂程度。这也就是我偏向于取简单代码的原因,因为不管是r2007兄的,还是wire兄的,还是我们教主的,输出的数据都是符合要求的,是正确的。我都会一一保存并加以研究。我sed和awk都是刚学,不精,这样的代码,我还是要一段时间啃一啃的。

另外,根据最新的log数据和程序员的介绍(最后我还是找到了他), ### END EVENT ### 后的字串并不是只有PROCESSED和PARSING_FAILED, 其实还有QUEUED和WAITING,只是这两种情况出现很少,但是还是有的。不知各位的代码扩展性如何,如果有这两种情况,是否也能排除呢? 谢谢了!
  yongjian 当前离线   回复时引用此帖
旧 04-04-15, 00:07 第 27 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,576
  精华: 9
 

另复r2007上帖:
PARSING_FAILED字串是不会出现在EVENT body中的。所有对EVENT处理的四种结果(PROCESSED, PARSING_FIELED, QUEUED, WAITING)都只会在### END EVENT ###后出现,这是程序代码的结构。不过作为纯的扩展性研究,我认为情况可以设想的多些。只要最后能有一定的规律可寻就行。
  yongjian 当前离线   回复时引用此帖
旧 04-04-15, 00:30 第 28 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

to yongjian:
我的脚本完全实现了你所说的功能。因为我的预想与你的实际情况是一致的。它具有很好的扩展性。
引用:
1. 你的时间戳以数字开头,以括号结尾。
代码:
if($0 ~ /^1.*\(.*\)$/) flag=1
我的代码满足这点。

2. 内容行数不是问题,因为我的脚本不是根据这个来过滤的。

3. 至于域间空行,通通都会过滤掉,所以空行的行数无关系。

4. 这两种可能我的脚本都兼顾到,甚至还有扩展性,除了PROCESS or PARSING_FAILED,任意字符串都会被脚本识别。

5. 没错,域间分布不均匀性被脚本解决了。

6. 最后一个空行是无关重要的,如果存在,它总会被我的脚本过滤掉,请看这段巧妙的代码,我是在每个域上根据上下文加入空行的,而非在域下加空行(这有可能造成文件末尾带有空行)
代码:
cnt++ if(cnt>=2) print ""
可见,从第二个域开始,在每个域上面加入空行。

此帖于 04-04-15 00:34 被 home_king 编辑.
  home_king 当前离线   回复时引用此帖
旧 04-04-15, 00:34 第 29 帖
r2007
 
r2007 的头像
 
 
注册会员  
  注册日期: Jul 2003
  帖子: 166
  精华: 0
 

我那段烦琐的没有用到PROCESSED进行判断,应该不用修改,wire的需要修改一下。
  r2007 当前离线   回复时引用此帖
旧 04-04-15, 10:49 第 30 帖
wire
 
 
 
注册会员  
  注册日期: Mar 2003
  帖子: 40
  精华: 0
 

如果 ### END EVENT ### 后的字串还有QUEUED和WAITING或更多的话,则要如下修改:
将第一个正则式放入所有不需打印的特征串;第二个放入所有要打印的特征串;结构不用修改。

如:仅打印PARSING_FAILED的记录
代码:
cat file | sed -n '/^\(PROCESSED\|QUEUED\|WAITING\)/{n;h;b};/^PARSING_FAILED/{H;x;p;n;x;b};/./!d;H'
或者 打印PARSING_FAILED和WAITING的记录
代码:
cat file | sed -n '/^\(PROCESSED\|QUEUED\)/{n;h;b};/^\(PARSING_FAILED\|WAITING\)/{H;x;p;n;x;b};/./!d;H'
这里要求所有可能的特征串都要列进来。
  wire 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 16:26


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2012, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2011, LinuxSir.Org