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

https://img2.mukewang.com/5c80d67e0001372908000335.jpg

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

请问如何解决?


一只斗牛犬
浏览 2414回答 2
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

料青山看我应如是

如果有更多的信息,可以用正则。&nbsp;提供一个傻瓜化的提取方案供参考:#!/bin/bashlog=1.txt getstart=$(cat&nbsp;$log&nbsp;|grep&nbsp;-n&nbsp;"/api/dialog"&nbsp;|awk&nbsp;&nbsp;-F':'&nbsp;'{print&nbsp;$1}'&nbsp;|xargs) getlink=$(cat&nbsp;$log&nbsp;|grep&nbsp;-n&nbsp;"^\["&nbsp;|awk&nbsp;&nbsp;-F':'&nbsp;'{print&nbsp;$1}'&nbsp;|xargs) startArray=(${getstart}) linkArray=(${getlink})for&nbsp;((&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;${#linkArray[*]};&nbsp;i++&nbsp;));&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;((&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;${#startArray[*]};&nbsp;j++&nbsp;));&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[[&nbsp;${startArray[$j]}&nbsp;-eq&nbsp;${linkArray[$i]}&nbsp;]];&nbsp;then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next=$(expr&nbsp;$i&nbsp;+&nbsp;2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"start&nbsp;line:${startArray[$j]}&nbsp;&nbsp;end&nbsp;line:${linkArray[$next]}" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=$(cat&nbsp;$log&nbsp;|sed&nbsp;-n&nbsp;"${startArray[$j]},${linkArray[$next]}p"&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;runTime=$(echo&nbsp;"$content"&nbsp;|grep&nbsp;"执行时间"&nbsp;|awk&nbsp;'{print&nbsp;$NF}') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;runParmas=$(echo&nbsp;"$content"&nbsp;|grep&nbsp;-v&nbsp;&nbsp;"执行时间"&nbsp;|grep&nbsp;-v&nbsp;"/api/dialog")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"API&nbsp;info&nbsp;&nbsp;/api/dialog&nbsp;&nbsp;&nbsp;runTime:&nbsp;${runTime}&nbsp;runParmas:${runParmas}" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi &nbsp;&nbsp;&nbsp;&nbsp;done&nbsp;done
打开App,查看更多内容
随时随地看视频慕课网APP