天天看点

GAWK(一):RS、FS与ORS、OFS等内置变量的用法

AWK作为日志分析的强大工具,如何分割、转换、匹配日志数据是分析的基础,而在分割操作中,最强大而简单的配置莫过于RS与FS,它们的关系如下:

ORS、OFS则用于输出分析报表,但需要注意的是,ORS与OFS只对print函数有效,对printf无效。

下面以一个非寻常格式的数据为例,样本如下:

姓名:甘腾升
年龄:29

姓名:李林
年龄:23
           

需要将其转换为如下格式的数据:

姓名 年龄
李浩 29
李林 23
总计 3人
           

那么只需要简单地设置RS、FS即可,awk程序如下:

#! /bin/awk -f
BEGIN {
    RS = "\n\n"
    FS = "\n"
    num = 
    print "姓名", "年龄"
}

#   awk行匹配操作
{
    split($1, name, ":")
    split($2, age, ":")
    num += 
    print name[], age[]
}
#   输出结果
END {
    print "总计", num "人"
}
           

这里再简单比较以下print与printf的区别:

1. awk中printf函数基本与c语言中的printf函数一样,支持字符串格式化;

2. print函数支持ORS与OFS参数,但不支持字符串格式化操作;

所以简单说,printf格式化字符串全靠手动,print格式化字符串全靠自动。

内置变量 含义
RS 行数据的分割符
FS 列数据的分割符
ORS 行数据的输出分割符
OFS 列数据的输出分割符

需要注意的是,ORS与OFS只对print函数有效,对printf无效,如下:

OFS = "="
for(i = ; i < ; i ++) {
    items[i]["name"] =  "*" i
    items[i]["value"] =  * i
}
#  确定数组的长度
len = length(items) + 
for(i = ; i < ; i ++) {
    print items[i]["name"], items[i]["value"]
    # printf需要手动指定分割符
    #printf("%d \t %d \n", items[i]["name"], items[i]["value"])
}
           

可能出现的错误

awk程序以Shell脚本方式运行时,提示如下错误:

awk: cmd. line:1: ./multirow.sh
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: ./multirow.sh
awk: cmd. line:1:   ^ unterminated regexp
           

错误的原因是解释器声明时忽略了“-f”参数,正确的写法是:

#! /bin/awk -f
# -f绝不可以省略
           

参考文档

  1. GAWK 入门:AWK 语言基础
  2. Gawk: Effective AWK Programming
  3. awk命令

继续阅读