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 |