0.简介
awk是三个主要作者的姓的首字母缩写:Drs. A. Aho、P. Weinberger 和 B. Kernighan。awk是命令行工具,更是一种解释性语言,awk的代码不需要进行编译,运行时将代码脚本传递给awk解释器。awk语言使用类似 C 语言的语法,包括控制语句和字符串函数,如 printf 和 sprintf,基本上是相同的。gawk 是 GNU Project 的 awk开源的实现版本。
1.基本概念
- 记录(Record):
由记录分隔符 分隔,记录分隔符RS
默认为换行符,所以默认一条记录就是一行。整个记录用$0表示 - 字段(Field)
将每个记录进一步分解为称作_字段_ 的单独的块。默认的字段分隔符FS
是任意数量的空白字符,包括制表符和空格字符。字段可以用$1,$2…表示 - 语法规则
/pattern/{action}
实际上是$0 ~/pattern/{action}
的简写,只有前半部分的判断pattern
的结果为真时,action
才会执行.~
是关系操作符,表示匹配。!~
为不匹配。 - BEGIN 和 END 模式
AWK 包含两种特殊的模式:BEGIN
和END
。BEGIN
模式指定了在处理任何记录之前需要执行的操作:BEGIN{action}
END
模式指定在处理了所有记录之后需要执行的操作:END{action}
2.工作原理
第一步,执行BEGIN{action}
。
第二步,从文件或stdin读取一行,执行/pattern/{action}
。重复执行这步直到最后一行。
第三步,执行END{action}
3.如何执行
- 1.命令行直接运行:
gawk -opt '/pattern/{action}' file
适合较短的awk程序 - 2.先编写gawk代码,保存到文件,如test.awk,再在命令行执行:
gawk -f test.awk file1,file2
- 3.把gawk命令
gawk '/pattern/{action}'
写进脚本文件 run.awk
再给该文件加执行权限:chmod +x run.awk
最后直接运行脚本文件:./run.awk file
4.常用语句,内建变量,内建函数
- action中常用语句
语句 | 描述 |
---|---|
exit | 停止程序的执行,并且退出。 |
next | 停止处理当前记录,并且前进到下一条记录。 |
nextfile | 停止处理当前文件,并且前进到下一个文件。 |
打印使用引号括起来的文本、记录、字段和变量。(默认打印出当前整行记录。) | |
printf | 打印格式化文本,类似于它的 C 语言对等成分,但必须指定结尾的换行。 |
- 常用的gawk内建变量
变量 | 描述 |
---|---|
NF | 每个记录的字段个数。 |
NR | 当前的记录个数。 读入多个文件时,NR会一直累计。 |
FNR | 每读到一个新的文件,FNR从0开始累计。 |
FS | 字段分隔符。 |
RS | 记录分隔符。 |
OFS | 输出字段分隔符。 |
ORS | 输出记录分隔符。 |
FILENAME | 所读取的输入文件的名称。 |
IGNORECASE | 当 IGNORECASE 设置为非空值,GAWK 将忽略模式匹配中的大小写。 |
- 常用内建函数
gawk内建函数包括算术函数和字符串函数,还有一些IO函数.length(s)
返回字符串长度,无参数返回$0长度split(string,array,[sep])
分割字符串到数组中,返回元素的个数,未指定sep
,使用FS
sub(regex,s,t)
在字符串t中,用s替换regex的首次匹配,成功返回1,否则返回0match(s,regex)
如果regex在s中出现,则返回出现的起始位置,没有出现返回0。并会设置RSTART
RLENGTH
的值。system(command)
执行系统命令
5.实例
- 只输出第10行
gawk 'NR==10{print $0}' file
- 统计词频
gawk '{for(i=1;i<=NF;i++){count[$i]++;}} END {for(i in count){print i,count[i]}}' file
- 计算行数
gawk 'END{print NR}' file
- 打印匹配正则表达式的行 (模拟grep)
gawk '/regex/ file'
6.参考资料
- gawk官方文档
- GAWK 入门:AWK 语言基础
- 【译】 AWK教程指南
- gawk学习笔记
- 《sed与awk》 第三版 Dale Dougherty & Arnold Robbins 著 张旭东 等译。