You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用awk打印匹配正则表达式的日志指定字段

awk提取指定格式字段实现方案

需求说明

从日志中提取打印所有形如svr08-core1-1654761552.278格式的字段,待处理日志样例如下:

"/usr/local/bin/publisher calllog -account='IE-00683' -uniqueid='svr08-core1-1654762416.510' -linkedid='svr08-core1-1654762416.510' -channel='SIP/IE-00683-72-000001f8' -sipcallid='3382826129@192_168_2_61' -originalsipcallid='3382826129@192_168_2_61' -src_ext='72' -dst_ext='44' -call_direction='internal' >>/var/log/asterisk/publisher_asterisk.log 2>&1 &") in new stack

实现命令

目标字段固定结构为服务标识-core编号-时间戳.序号,对应正则规则为[a-z0-9]+-core[0-9]+-[0-9]+\.[0-9]+,用Linux环境默认的GNU awk即可完成提取。

提取每行首个匹配字段

把命令里的日志路径替换成实际文件路径直接执行即可:

awk 'match($0, /[a-z0-9]+-core[0-9]+-[0-9]+\.[0-9]+/, res) {print res[0]}' /var/log/your_log_file.log

提取行内所有匹配字段

如果同一行存在多个符合格式的字段(比如样例里uniqueid、linkedid的取值都符合要求),需要全部提取时用以下命令:

awk '{
    while(match($0, /[a-z0-9]+-core[0-9]+-[0-9]+\.[0-9]+/, res)) {
        print res[0]
        $0 = substr($0, RSTART + RLENGTH)
    }
}' /var/log/your_log_file.log

逻辑说明

  • $0 代表awk当前读取处理的整行日志内容
  • match()是awk内置正则匹配函数,匹配成功后,匹配起始位置会存入内置变量RSTART,匹配内容长度存入RLENGTH,完整匹配结果存入自定义的res数组,res[0]就是我们要的目标字段
  • 每次匹配完成后通过substr()截断已经匹配过的文本段,继续向后遍历,就能把同一行内所有符合格式的字段都找出来,不会重复匹配。

样例输出

针对给出的日志样例,执行全量提取命令后的输出为:

svr08-core1-1654762416.510
svr08-core1-1654762416.510

内容的提问来源于stack exchange,提问作者Nazlı YANIK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:09:19