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

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

Created with Raphaël 2.1.0 输入文件 获取行数据(RS) 获取列数据(FS) 继续分割(split)

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

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

姓名:甘腾升
年龄:29

姓名:李林
年龄:23

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

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

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

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

#   awk行匹配操作
{
    split($1, name, ":")
    split($2, age, ":")
    num += 1
    print name[2], age[2]
}
#   输出结果
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 = 1; i < 5; i ++) {
    items[i]["name"] = 5 "*" i
    items[i]["value"] = 5 * i
}
#  确定数组的长度
len = length(items) + 1
for(i = 1; i < 5; 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命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值