如圖中為日志的一段內容,現在需要統計這個接口的執行時間以及對應的參數。也就是需要拿到 /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 關注
- 3115 瀏覽
添加回答
舉報
0/150
提交
取消