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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:05:34