如图中为日志的一段内容,现在需要统计这个接口的执行时间以及对应的参数。也就是需要拿到 /api/dialog 这 一行开始直到 [ info ] 执行时间: 1.03604388237 这一行结束的之间的所有内容,我用 grep 很难拿到这些内容,只能取某一行的内容,跨行就不行了。请问如何解决?
2 回答
慕慕森
TA贡献1856条经验 获得超17个赞
可改用 sed
命令, 如
sed -e '/\/api\/dialog/,/执行时间/!d' a.txt
对应 a.txt 文件内容
[ 0 ] GET /api/hi [ info ] 执行时间: 0[ 1 ] GET /api/dialog [ info ] 执行时间: 1[ 2 ] POST /api/dialog [ info_api ] array ( 'a' => 2) [ info ] 执行时间: 2[ 3 ] POST /api/dialog [ info_api ] array ( 'a' => 3) [ info ] 执行时间: 3
输出
[ 1 ] GET /api/dialog [ info ] 执行时间: 1[ 2 ] POST /api/dialog [ info_api ] array ( 'a' => 2) [ info ] 执行时间: 2[ 3 ] POST /api/dialog [ info_api ] array ( 'a' => 3) [ info ] 执行时间: 3
一只斗牛犬
TA贡献1784条经验 获得超2个赞
如果有更多的信息,可以用正则。
提供一个傻瓜化的提取方案供参考:
#!/bin/bashlog=1.txt getstart=$(cat $log |grep -n "/api/dialog" |awk -F':' '{print $1}' |xargs) getlink=$(cat $log |grep -n "^\[" |awk -F':' '{print $1}' |xargs) startArray=(${getstart}) linkArray=(${getlink})for (( i = 0; i < ${#linkArray[*]}; i++ )); do for (( j = 0; j < ${#startArray[*]}; j++ )); do if [[ ${startArray[$j]} -eq ${linkArray[$i]} ]]; then next=$(expr $i + 2) echo "start line:${startArray[$j]} end line:${linkArray[$next]}" content=$(cat $log |sed -n "${startArray[$j]},${linkArray[$next]}p" ) runTime=$(echo "$content" |grep "执行时间" |awk '{print $NF}') runParmas=$(echo "$content" |grep -v "执行时间" |grep -v "/api/dialog") echo "API info /api/dialog runTime: ${runTime} runParmas:${runParmas}" fi done done
- 2 回答
- 0 关注
- 3078 浏览
添加回答
举报
0/150
提交
取消