AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫AWK是因为其取了三位创始人Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
1 | awk [选项参数] 'script' var=value file(s) |
常用选项参数说明
- -F fs
指定输入文件的分隔符,fs是一个字符串或者是一个正则表达式,如-F:。 - -V var=value
赋值一个用户定义变量 - -f scripfile
从脚本文件中读取awk命令。
基本用法
log.txt文本内容如下:
1 | 2 this is a test |
用法一
awk ‘{[pattern] action}’ {filenames} # 行匹配语句 awk ‘’ 只能用单引号
实例:
1 | # 每行按空格或TAB分割,输出文本中的1、4项 |
用法二
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
1 | # 使用","分割 |
用法三
awk -v # 设置变量
实例:
1 | $ awk -va=1 '{print $1,$1+a}' log.txt |
用法四
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
| 运算符 | 描述 |
|---|---|
| = += -= *= /= %= ^= **= | 赋值 |
| ?: | C条件表达式 |
| || | 逻辑或 |
| && | 逻辑与 |
| ~ ~! | 匹配正则表达式和不匹配正则表达式 |
| < <= > >= != == | 关系运算符 |
| 空格 | 连接 |
| + - | 加,减 |
| * / % | 乘,除与求余 |
| + - ! | 一元加,减和逻辑非 |
| ^ *** | 求幂 |
| ++ -- | 增加或减少,作为前缀或后缀 |
| $ | 字段引用 |
| in | 数组成员 |
1 | $ awk '$1>2' log.txt #命令 |
- 过滤第一列等于2的行
1 | $ awk '$1==2 {print $1,$3}' log.txt #命令 |
- 过滤第一列大于2并且第二列等于’Are’的行
1 | $ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令 |
内置变量
| 变量 | 描述 |
|---|---|
| \$n | 当前记录的第n个字段,字段间由FS分隔 |
| \$0 | 完整的输入记录 |
| ARGC | 命令行参数的数目 |
| ARGIND | 命令行中当前文件的位置(从0开始算) |
| ARGV | 包含命令行参数的数组 |
| CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
| ERRNO | 最后一个系统错误的描述 |
| FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
| FILENAME | 当前文件名 |
| FNR | 各文件分别计数的行号 |
| FS | 字段分隔符(默认是任何空格) |
| IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
| NF | 输入字段分割符 |
| NR | 已经读出的记录数,就是行号,从1开始 |
| OFMT | 数字的输出格式(默认值是%.6g) |
| OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
| ORS | 输出记录分隔符(默认值是一个换行符) |
| RLENGTH | 由match函数所匹配的字符串的长度 |
| RS | 记录分隔符(默认是一个换行符) |
| RSTART | 由match函数所匹配的字符串的第一个位置 |
| SUBSEP | 数组下标分隔符(默认值是/034) |
1 | # 输出第二列包含 "th",并打印第二列与第四列 |
~ 表示模式开始。//中是模式
1 | # 输出包含"re" 的行 |
忽略大小写
1 | $ awk 'BEGIN{IGNORECASE=1} /this/' log.txt |
模式取反
1 | $ awk '$2 !~ /th/ {print $2,$4}' log.txt |
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
- BEGIN{ 这里面放的是执行前的语句 }
- END {这里面放的是处理完所有的行后要执行的语句 }
- {这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
1 | $ cat score.txt |
我们的awk脚本如下:
1 | $ cat cal.awk |
我们来看一下执行结果:
1 | $ awk -f cal.awk score.txt |

