如何用awk提取日志中的指定列及双引号内的文本?
解决方案
方法1:使用awk的match()函数(推荐,适配任意双引号内容)
直接在awk中匹配整行里的双引号包裹内容,同时提取指定列:
awk '{ # 匹配双引号及其中的内容,正则/"[^"]+"/表示匹配从"开始到下一个"结束的字符串 match($0, /"[^"]+"/) # 提取$1(日期)、$3(日志级别),再用substr取出匹配到的双引号内容 print $1, $3, substr($0, RSTART, RLENGTH) }' mylog.log
解释:
match($0, /"[^"]+"/)会定位到行内第一对双引号的位置,RSTART是匹配起始索引,RLENGTH是匹配长度substr($0, RSTART, RLENGTH)直接提取出带双引号的内容,无需额外拼接
方法2:多分隔符结合提取
通过指定空格和双引号作为分隔符,直接提取各部分:
awk -F '[ "]' '{ # $1是日期,$3是日志级别,$10是双引号内的纯文本,手动补回双引号 print $1, $3, "\""$10"\"" }' mylog.log
注意:这种方式依赖日志格式的字段位置固定,如果双引号内的内容包含特殊结构可能导致字段偏移,不如方法1通用。
方法3:拆分处理字段和双引号内容
先提取双引号内的内容,再拆分前面的字段:
awk -F '"' '{ # 提取=>之前的部分,拆分出日期和日志级别 split(substr($0, 1, index($0, "=>")-1), prefix_arr) # 组合日期、级别和带双引号的内容 print prefix_arr[1], prefix_arr[3], "\""$2"\"" }' mylog.log
解释:
substr($0, 1, index($0, "=>")-1)截取=>之前的所有内容split()将截取的内容按空格拆分为数组,取第1和第3个元素就是日期和日志级别
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

