语法
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 打印偶数行