如何使用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
相关产品推荐
相关产品推荐

