Chinaunix

标题: OFFLINE 模拟 [打印本页]

作者: KoomIer    时间: 2012-10-03 14:58
标题: OFFLINE 模拟
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
   
或者有别的建议对实现这个东西也欢迎提出,谢谢

作者: yinyuemi    时间: 2012-10-03 23:58
回复 1# KoomIer


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


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2