- 论坛徽章:
- 0
|
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
或者有别的建议对实现这个东西也欢迎提出,谢谢
|
|