Windows下GNU Awk使用[]作为分隔符提取日志字段的问题
解决Windows下GNU Awk 4.2.1拆分日志字段的问题
针对你给出的日志格式,推荐两种可行的处理方案:
方案一:自定义字段分隔符(FS)并清理残留字符
利用FS设置匹配[或]后接空格的分隔规则,再单独清理时间字段末尾的],最后格式化输出:
gawk "BEGIN { FS=\"\\[|\\]\\s+\" } { \$2 = gensub(/]$/, \"\", 1, \$2); printf \"%-25s | %-8s | %-8s | %-18s | %s\\n\", \$2, \$3, \$4, \$5, \$6 }" logfile.txt
说明:
FS=\"\\[|\\]\\s+\":将[或者]后跟一个/多个空格作为字段分隔符,拆分后行首的[会导致$1为空,后续字段从$2开始gensub(/]$/, "", 1, $2):移除时间字段$2末尾残留的]printf的格式化参数可以根据实际需求调整宽度,保证输出对齐
方案二:使用FPAT匹配目标字段(更直观)
FPAT用于定义每个字段的匹配模式,直接提取[...]格式的内容和剩余的日志消息,再统一清理字段首尾的[]:
先创建一个脚本文件process_log.awk:
BEGIN { # 匹配模式:要么是[...]格式的内容,要么是非空白开头的剩余文本 FPAT = "\\[[^]]+\\]|\\S.*" } { # 移除所有字段首尾的[] $1 = gensub(/^\[|\]$/, "", "g", $1) $2 = gensub(/^\[|\]$/, "", "g", $2) $3 = gensub(/^\[|\]$/, "", "g", $3) $4 = gensub(/^\[|\]$/, "", "g", $4) # 格式化输出 printf "%-25s | %-8s | %-8s | %-18s | %s\n", $1, $2, $3, $4, $5 }
然后在命令行运行:
gawk -f process_log.awk logfile.txt
说明:
FPAT的规则更贴合日志的结构,无需处理空字段的顺序问题- 统一清理
[]的逻辑更简洁,后续字段直接对应目标内容
两种方案都能输出你需要的格式,推荐方案二,可读性和维护性更好。
内容的提问来源于stack exchange,提问作者MyICQ
相关产品推荐
相关产品推荐

