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绝不可以省略
参考文档
- GAWK 入门:AWK 语言基础
- Gawk: Effective AWK Programming
- awk命令