Chinaunix
标题:
OFFLINE 模拟
[打印本页]
作者:
KoomIer
时间:
2012-10-03 14:58
标题:
OFFLINE 模拟
1. 我有一个较大日志文件,内容格式格式如下:
Server> Input1
output1
.......
Server> Input2
output2
......
Server> Input3 arg1 arg2
output3
........
Server> Input4
Output4
......
复制代码
我的目标: 基于这个文本日志模拟在线交互, 即我输入input1, 要得到output1, 输入input2得到output2....
2. 我的实现想法:
1>, 通过^Server> 遍历得到所以可能的输入的行号, 和命令
行号加命令所在行: grep "^Server> " -n
复制代码
行号数组: export lines=(`sed -n '/^Server> /=' $filename`)
复制代码
我想得到单独的命令数组, 这样就出问题了:因为有类似于input3那样的带参数的数组
2> 所以我目前实现是, 等到输入然后用输入去匹配整个文件得到行号
lineno=`sed -n '/^Server> '"$1\s*$"'/=' $filename`
复制代码
然后通过得到的行号再去匹配数组, 从而得到这条命令的输出的开始和结束位置
for ((i=0;i<${#lines[@]};i++));do
#echo ${lines[$i]},$lineno
if [ "${lines[$i]}" == "$lineno" ];then
read_command_print_out "$i"
break
fi
done
复制代码
3> 因为日志文件大小很大, 我想尽量减少读文件的次数
目前读取文件次数为:
开始预处理
没得到一个输入, 判断时候合法, 查询整个文件一次
得到了输出的开始结束行号之后, 又做了一次整个文件的处理(输出文件的指定行段)
4> 想改进的地方:
对输入, 判断完是否合法后, 查询一个命令合集数组得到是第几条标, 这样可以减少一次文件读取
即建议一个类似于这样的数组:
##预处理文件,得到两个数组
cmdlist[0]="input1" <----> lineno[0]= LineNo_of_input1
cmdlist[1]="input2" <----> lineno[1]= LineNo_of_input2
cmdlist[2]="input3 arg1 arg2" <----> lineno[2]= LineNo_of_input3
cmdlist[3]="input4" <---->lineno[3]= LineNo_of_input4
........
##输入与cmdlist数组匹配
read Input
match Input cmdlist
返回下表x, 判断时候为最尾部
sed -n $lineno[x]','$lineno[x+1]'p' $filename
复制代码
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