免费注册 查看新帖 |

Chinaunix

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

[文本处理] OFFLINE 模拟 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-03 14:58 |只看该作者 |倒序浏览
1. 我有一个较大日志文件,内容格式格式如下:
  1. Server> Input1
  2. output1
  3. .......
  4. Server> Input2
  5. output2
  6. ......
  7. Server> Input3 arg1 arg2
  8. output3
  9. ........
  10. Server> Input4
  11. Output4
  12. ......
复制代码
我的目标: 基于这个文本日志模拟在线交互, 即我输入input1, 要得到output1, 输入input2得到output2....

2. 我的实现想法:
1>, 通过^Server> 遍历得到所以可能的输入的行号, 和命令
  1. 行号加命令所在行: grep "^Server> " -n
复制代码
  1. 行号数组: export lines=(`sed -n '/^Server> /=' $filename`)
复制代码
我想得到单独的命令数组, 这样就出问题了:因为有类似于input3那样的带参数的数组
2> 所以我目前实现是, 等到输入然后用输入去匹配整个文件得到行号
  1. lineno=`sed -n '/^Server> '"$1\s*$"'/=' $filename`
复制代码
然后通过得到的行号再去匹配数组, 从而得到这条命令的输出的开始和结束位置
  1. for ((i=0;i<${#lines[@]};i++));do
  2.          #echo ${lines[$i]},$lineno
  3.          if [ "${lines[$i]}" == "$lineno" ];then
  4.              read_command_print_out "$i"
  5.              break
  6.          fi
  7.       done
复制代码
3> 因为日志文件大小很大, 我想尽量减少读文件的次数
    目前读取文件次数为:
     开始预处理
     没得到一个输入, 判断时候合法, 查询整个文件一次
     得到了输出的开始结束行号之后, 又做了一次整个文件的处理(输出文件的指定行段)

4> 想改进的地方:
     对输入, 判断完是否合法后, 查询一个命令合集数组得到是第几条标, 这样可以减少一次文件读取
     即建议一个类似于这样的数组:

  1.       ##预处理文件,得到两个数组
  2.      cmdlist[0]="input1"                  <----> lineno[0]= LineNo_of_input1
  3.      cmdlist[1]="input2"                  <----> lineno[1]= LineNo_of_input2
  4.      cmdlist[2]="input3 arg1 arg2"   <----> lineno[2]= LineNo_of_input3
  5.      cmdlist[3]="input4"                  <---->lineno[3]= LineNo_of_input4
  6.     ........
  7.      ##输入与cmdlist数组匹配
  8.     read Input
  9.     match Input cmdlist
  10.     返回下表x, 判断时候为最尾部
  11.     sed -n $lineno[x]','$lineno[x+1]'p' $filename
  12.      
复制代码
cmdlist目前不知道如何得到, 用一般命令处理,得到的总是cmdlist[2]=input3, cmdlist[3]=arg1
   
或者有别的建议对实现这个东西也欢迎提出,谢谢

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2012-10-03 23:58 |只看该作者
回复 1# KoomIer


    seek函数应该可以比较好的选择,不过bash下好像没有对应的函数,你可以用perl或C写会快,如果数据有规律的话,可以建立一个index文件,记录每个input开始的字节数,用seek函数读取文件满足条件的相应部分,这样效率应该会比较好

论坛徽章:
0
3 [报告]
发表于 2012-10-04 20:49 |只看该作者
Thank you .

我就是因为最近常用cygwin, 而且想联系一下shell, 正好实现一个这个offline模拟, 有点意义吧。
应该现在先做出来第一个版本来, 以后再考虑python或者perl改吧

现在的主要需求:
1. 一个可变长的日志查询, 命令输入顺序不定, 输出长度不定, 所以是完全基于日志的, 所以为了提高速度我就想先建立两个数组, 然后查询数组输出
这个已经实现, 就差提高效率了

2. 对于具有结构体数据的查询, 这个格式是固定的, 但是要做模糊匹配, 而且还希望对一些特殊带值数据变量存储输出

这个相对简单些
Name    Name.attribut  Name.attribute.meaning Name.action Name.action.explain
。。。。
文件时固定的大文件, 然后查询所以的属性值的意义, 还有可能的操作

3. 1,2 想结合, 对日志中得到的属性值经行提取, 并存储, 改变为可视化程度更高的输出方式


回复 2# yinyuemi


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP