在 awk 中解析非标准表格日志的关键是正确设置 fs 和 ofs,二者支持正则表达式且可独立指定;常用 -f 设置输入分隔符,ofs 控制 print 输出分隔;固定宽度用 fieldwidths 或 substr;还可动态修改 fs 或用 split 灵活切分。

在 awk 中解析非标准表格日志(如用竖线 |、制表符 \t、多个空格、冒号 : 甚至固定宽度)的关键,是正确设置输入字段分隔符(FS)和输出字段分隔符(OFS),二者可独立指定,且支持正则表达式。
用 -F 指定输入分隔符(FS)
-F 是最常用方式,直接在命令行指定单字符或正则分隔符。例如:
- 竖线分隔:
awk -F '|' '{print $1, $3}' logfile - 多个连续空格或制表符:
awk -F '[[:space:]]+' '{print $2, $4}' logfile - 冒号加空格混合:
awk -F ':[[:space:]]*' '{print $1, $NF}' logfile - 固定宽度字段(需用
substr或FIELDWIDTHS,见下文)
用 OFS 控制输出列间分隔符
OFS(Output Field Separator)决定 print , 这类逗号分隔输出时的连接符,默认为空格。可显式设置:
- 输出用制表符:
awk -F '|' 'BEGIN{OFS="\t"} {print $1, $3}' logfile - 输出用竖线:
awk -F '\t' 'BEGIN{OFS="|"} {print $2, $5, $1}' logfile - 输出不带分隔符(拼接):
BEGIN{OFS=""},然后print $1$2或print $1,$2(此时 OFS 生效)
处理固定宽度日志(无明确分隔符)
当字段靠位置对齐(如系统日志、某些审计日志),可用 FIELDWIDTHS(GNU awk 特有)或 substr():
- 用
FIELDWIDTHS:指定每列字宽,如awk 'BEGIN{FIELDWIDTHS="10 8 15 20"} {print $1, $3}' logfile - 用
substr手动截取:awk '{user=substr($0,1,12); pid=substr($0,13,6); cmd=substr($0,20,30); print user, pid, cmd}' logfile - 注意:使用
FIELDWIDTHS时FS和-F会被忽略
动态分隔符与运行时修改
可在脚本中根据行内容动态调整 FS,比如日志头尾格式不同:
- 首行设分隔符:
NR==1 {FS=":"; next} {print $1, $2} - 匹配某模式后切换:
/^START/ {FS="|"; next} /^END/ {FS=" "; next} {print $1} - 用
split()灵活切分:{n=split($0,a,/[\t|;]+/); print a[1], a[n]}











