如何用Bash/GNU工具提取日志中每行的耗时数值?
解决方案
针对日志行包含多个条目、需要提取所有耗时数值的问题,这里提供几种实用的bash/GNU工具解决方案:
方法1:用grep精准匹配数值模式
利用grep的-o选项(仅输出匹配部分),结合正则表达式匹配浮点数格式,直接提取所有耗时:
grep my_function $LOG_FILE | grep -o '[0-9]\+\.[0-9]\+'
解释:
- 第一个
grep先过滤出包含my_function的行(如果是已经处理后的日志,可省略此步骤) - 第二个
grep -o会把每行中所有符合「数字+.+数字」格式的内容单独输出,每行一个数值,完美适配单行多条目的情况。
方法2:用awk基于关键词定位
如果担心日志中存在其他浮点数导致误匹配,可以用awk基于took关键词定位其后的耗时数值:
grep my_function $LOG_FILE | awk '{for(i=1;i<=NF;i++) {if($i == "took") print $(i+1)}}'
解释:
- 遍历每行的所有字段(
NF代表当前行的字段总数) - 当遇到字段等于
took时,输出它的下一个字段(即耗时数值),不管一行里有多少个took,都会被逐一提取。
方法3:用sed拆分后过滤
通过sed把所有非数值相关的字符替换为换行,再过滤空行得到结果:
grep my_function $LOG_FILE | sed -E 's/[^0-9.]/\n/g' | grep -v '^$'
解释:
sed -E用正则把所有不是数字和小数点的字符替换成换行符,将原整行拆分为多行grep -v '^$'过滤拆分后产生的空行,剩下的就是所有耗时数值。
内容的提问来源于stack exchange,提问作者Green 绿色
相关产品推荐
相关产品推荐

