亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

linux中正則匹配指定開頭和結尾的一段(有換行)內容?

linux中正則匹配指定開頭和結尾的一段(有換行)內容?

LEATH 2019-03-05 17:25:00
如圖中為日志的一段內容,現在需要統計這個接口的執行時間以及對應的參數。也就是需要拿到 /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


查看完整回答
反對 回復 2019-03-05
?
一只斗牛犬

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


查看完整回答
反對 回復 2019-03-05
  • 2 回答
  • 0 關注
  • 3115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號