语法
awk [options] 'Pattern{action}' file ...
| 变量名 | 含义 |
|---|---|
| $0 | 整行 |
| $n | 列数 |
| $NF | 当前行的最后一列 |
| NF | 当前行的列数 |
Action(动作)
| 参数 | 含义 |
|---|---|
| 打印 | |
| printf | 格式化打印 |
| exit | 退出awk |
| if | 条件语句 |
| if...else | 条件语句 |
| if...else if | 条件语句 |
| for | 循环语句 |
| while | 循环语句 |
| do...while | 循环语句 |
整行输出
{print $0} 等于 {print}{print $0,$1} ","的作用相当于输出$0后,添加一个输出分割符
Pattern(模式)
空模式
关系运算模式
BEGIN/END模式
正则模式
行范围模式- BEGIN/END模式
|参数|含义|
|----|----|
|BEGIN|在action前执行|
|END|在action后执行| - 关系运算模式
|关系运算符|含义|用法示例|
|----|----|----|
|<|小于|x < y|
|<=|小于等于|x <= y|
|==|等于|x == y|
|!=|不等于|x != y|
|>=|大于等于|x >= y|
|>|大于|x > y|
|~|与对应的正则匹配则为真|x~ /正则/|
|!~|与对应的正则不匹配则为真|x !~ /正则/| 正则模式
使用{x,y}这种次数匹配的正则表达式时需要配合--posix选项或者--re-interval选项
awk '/正则表达式/{Action}' file //正则表达式需要放在"/ /"中
- 行范围模式
awk '/正则表达式1/[,/正则表达式2/]{Action}' file
awk 'BEGIN{print "aaa","bbb"}' test.txt 在处理test.txt之前先打印"aaa""bbb"
awk '{print $1}END{print "aaa"}' test.txt 在处理test.txt之后打印"aaa"
awk 'BEGIN{print "aaa"}{print $1,$2}' test.txt
options(选项)
| 参数 | 含义 | 示例 | 注释 |
|---|---|---|---|
| -F | 指定分隔符 | -F: | 以":"作为分割符 |
| -v | 设置变量 | -v FS='#' | 设置"#"为默认的输入分割符 |
变量
| 变量 | 作用 | 注解 |
|---|---|---|
| FS | 输入分割符,默认为空格 | field separator |
| OFS | 输出分割符,默认为空格 | output field separator |
| RS | 输入记录分割符(输入换行符) | 指定输入时的换行符 |
| ORS | 输出记录分割符(输出换行符) | 输出时用指定符号代替换行符 |
| NF | 当前行的字段数量 | number of field |
| NR | 行号 | 当前处理的文本的行号 |
| FNR | 各文件分别计数的行号 | 处理多个文本是标注出不同文本的行号 |
| FILENAME | 当前文件名 | 打印当前文件名 |
| ARGV | 将命令行的各个参数保存成数组 | 'program{action}'不算参数 |
| ARGC | 命令行参数的个数 | ARGV数组的长度 |
- 自定义变量
//各种方式定义自定义变量
awk -v myvar="mrhonest" '{print myvar}'
awk 'BEGIN{myvar="mrhonest";print myvar}'
//一次性定义多个变量
awk 'BEGIN{myvar1="mr";myvar2="honest";print myvar1,myvar2}'
//引用shell中的变量
abc="mrhonest"
awk -v myvar=$abc 'BEGIN{print myvar}'
格式化
数组
awk的数组下标默认从1开始
函数
- 算数函数
|函数|作用|
|----|----|
|rand()|生成随机数,如果不配合srand()使用,函数的返回值将一直不变|
|srand()|初始化随机数发生器,用于何止rand()产生随机数时的种子|
|int()|截取数字整数部分的值| - 字符串函数
|函数|作用|
|----|----|
|sub()|在指定的范围内查找指定字符,并将其替换为指定的字符串,只替换匹配到的第一个值|
|gsub()|替换指定范围内所有的指定字符|
|length()|获取指定字符串的长度|
|index()|获取指定字符位于整个字符串中的位置|
|split()|将指定字符串生成数组| 其它函数
|函数|作用|
|----|----|
|asort()|根据数组元素值排序,返回值是数组的长度|
|asorti()|根据数组元素下标排序|三元运算
条件 ? 结果1 : 结果2 表达式1 ? 表达式2 : 表达式3
打印奇偶行
awk 'i=!i' file 打印奇数行 awk '!(i=!i)' file 打印偶数行