为了账号安全,请及时绑定邮箱和手机立即绑定

linux中正则匹配指定开头和结尾的一段(有换行)内容?

linux中正则匹配指定开头和结尾的一段(有换行)内容?

一只斗牛犬 2019-03-07 16:29:10
如图中为日志的一段内容,现在需要统计这个接口的执行时间以及对应的参数。也就是需要拿到 /api/dialog 这 一行开始直到 [ info ] 执行时间: 1.03604388237 这一行结束的之间的所有内容,我用 grep 很难拿到这些内容,只能取某一行的内容,跨行就不行了。请问如何解决?
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

可改用 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


查看完整回答
反对 回复 2019-03-07
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

如果有更多的信息,可以用正则。 
提供一个傻瓜化的提取方案供参考:

#!/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


查看完整回答
反对 回复 2019-03-07
  • 2 回答
  • 0 关注
  • 2395 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信