一、awk 概述
- awk 是一种可用于选择文件中的特定记录并对其执行操作的程序。
- awk 命令行语法如下
awk [options] -f progfile [- -] file …
awk [options] [–] ‘program’ file …- options是命令行选项
- progfile是awk程序文件
- --表示命令行选项截止,以后首字母为-的文件或其它不会视为选项
- file为输入文件
- program为awk程序脚本
- awk 可以使用管道,也可以将管道输入看做文件,可以使用-来代替
some_command | awk -f ‘program’ file1 - file2
二、常用命令行选项
- -F fs 设置FS,字段分隔符
- -f source-file 从source-file读取程序,可多次指定
- -v var=val 设置变量var的值为val,使用-v一次只能设置一个变量,但是可以多次使用-v
三、常用内置变量
-
FS(Field Separators)
- 字段分隔符,默认为" "。不仅可以是空格,还可以是\t和\n,还是组合的序列。
- 可以设置为单字符或正则。
-
OFS(Output Field Separator)
- 输出字段分隔符,默认为" "。
-
RS(Record Separator)
- 记录分隔符,默认为\n。
- 记录可以不止以行分隔,当RS设置为空时,类似于设置\n\n+,可以用空行来分隔记录.
cat>addresses<<-EOF Jane Doe 123 Main Street Anywhere, SE 12345-6789 John Smith 456 Tree-lined Avenue Smallville, MW 98765-4321 EOF
awk 'BEGIN{RS="";FS="\n"} {print "Name is:",$1;print "Address is:",$2;print "City and state are:", $3;print ""}' addresses awk 'BEGIN{RS="\n\n+";FS="\n"} {print "Name is:",$1;print "Address is:",$2;print "City and state are:", $3;print ""}' addresses
-
ORS(Output Record Separator)
- 输出记录分隔符,默认为\n
-
NR(Number of Records)
- 从程序开始执行,正在处理的记录数,每读一条Record加1
-
NF(Number of Fields )
- 当前输入记录中的字段总数,一个新的记录被读取,NF就被重置
-
FNR(File Number of Records)
- 当前文件中的当前记录编号,当一个新文件读取,FNR重置为0,而NR不会
四、awk 程序脚本
awk 程序的语法如下
[pattern] { action }
pattern [{ action }]
…
function name(args) { … }
…
1. pattern
pattern 即模式,pattern用来查找匹配的record
- BEGIN 会在读入第一条record前被执行,而且只执行一次
- END 会在所有record读取完毕执行,也只会执行一次
- /regular expression/ 正则表达式,匹配输入的record
- expression 如果表达式的值为非零(如果是数字)或非空(如果是字符串),则模式匹配
- begpat, endpat 匹配范围从开始模式begpat到结束模式endpat
- pattern 为空,那代表匹配每一条record
2. action
- action 是在匹配pattern后,需要完成的动作。使用action 时{}不能省略,如果只有pattern,没有action,那相当于{print $0}。
- action 包含以下类型语句
- 表达式语句 调用函数或者为变量赋值
- 控制语句 控制的程序流程
- If语句: 有条件地执行一些 awk 语句.
if (condition) then-body [else else-body]
- While语句: 循环, 直到满足某些条件.
while (condition) body
- Do语句: 在循环时执行指定的操作, 直到满足某些条件.
do body while (condition)
- For语句: 另一个循环语句, 提供初始化和增量子句
for (initialization; condition; increment) body
- Switch语句: 基于值的语句,按条件执行
switch (expression) { case value or regular expression: case-body default: default-body }
- Break语句: 终止当前循环执行
break
- Continue语句: 结束本次循环,进行下一次循环
continue
- Next语句: 停止处理当前输入记录
next
- Nextfile语句: 停止处理当前文件
nextfile
- Exit语句: 停止awk执行.
exit [return code]
- If语句: 有条件地执行一些 awk 语句.
- 复合语句 用大括号包裹的多条语句
- 输入语句 使用getline,next,nextfile获取输入
- 输出语句 例如print,printf
- 删除语句 使用delete删除数组元素
五、awk 数组
- awk 数组的索引可以是数字、字符串,不必是连续的正整数。数字也是被当成字符串保存的。
- 遍历数组
for (var in array) body
- 删除数组元素
delete array[index-expression]
- 多维数组
- 多维数组的索引不是单个的索引,而是多个索引序列。例如二维数组,索引就是两个,array[x,y]
- 多维数组实际上还是一维数组,只是将多维数组的多个索引转化为字符串用内置变量SUBSEP来连接。例如:当SUBSEP=@时,array[1,2]与array[1@2]等价。默认SUBSEP为"\034"
- 多维数组遍历
for (combined in array) { # split分割字符串为数组 split(combined, separate, SUBSEP) # separate[1]是第一个 … }
六、awk 函数
- 内置函数
- 数字函数
- 字符串函数
- IO函数
- 时间函数
- 按位函数
- 类型函数
- i18n函数
- 自定义函数
- 定义语法
- 语法如下
function name([parameter-list]) { body-of-function }
- https://www.gnu.org/software/gawk/manual/gawk.html#Definition-Syntax
- 语法如下
- 注意事项
- return语句
- 函数例子
- 动态类型
- 定义语法
- 间接函数调用