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

clipboard.png 如图中为日志的一段内容,现在需要统计这个接口的执行时间以及对应的参数。也就是需要拿到 /api/dialog 这 一行开始直到 [ info ] 执行时间: 1.03604388237 这一行结束的之间的所有内容,我用 grep 很难拿到这些内容,只能取某一行的内容,跨行就不行了。

请问如何解决?
阅读 6.1k
2 个回答

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

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

#!/bin/bash
log=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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题