awk:强大的文本分析工具
熟悉Linux的就不都不知道awk命令,校招的时候还被问道过awk命令的一些用法。awk取自三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。更多命令参考《Linux 命令大全》
awk '{[pattern] action}' {filenames}
1、简单用例
长时间不用很容易忘,看看简单的一些用法。演示数据test.txt,内容如下:
Beth 4.00 0
Dan 3.75 0
kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
1.1、输出某一列
查看某一列数据,打印{pinrt $n}
//输出第二列数据
awk '{print $2}' test.txt
//输出如下
4.00
3.75
4.00
5.00
5.50
4.25
1.2、输出符合条件的列数据
这时就用到了action
//输出第三列大于10的,却打印出对应的第二列数据
awk '$3 > 10 {print $2}' test.txt
//输出如下
5.00
5.50
4.25
1.3、打印第一列和最后一列数据
第一列数据好或得,$0即可。最后一列呢?如果不知道有多少列怎么获取$n。还好awk有内建变量NF,可以使用,详细参考第三节。
//需要 , 分开
awk '{print $1 , $NF}' test.txt
//输出如下
Beth 0
Dan 0
kathy 10
Mark 20
Mary 22
Susie 18
1.4、一行有多少列
awk有内建变量NF
//使用NF内建变量
awk '{print NF}' test.txt
//输出如下
3
3
3
3
3
3
1.5、行号
内建变量, 叫做 NR
//输出第三列大于10的,带上行号
awk '$3 > 10 {print NR , $NF}' test.txt
//输出如下
4 20
5 22
6 18
1.6、计算
对列与列之间的数据进行计算
//第二、三列数据相乘
awk '{print $2 * $3}' test.txt
//输出如下
0
0
40
100
121
76.5
2、awk全部选项
POSIX选项 GNU长选项:(标准)
-f progfile --file=progfile
-F fs --field-separator=fs
-v var=val --assign=var=val
Short选项 GNU长选项:(扩展名)
-b --characters-as-bytes
-c --traditional
-C --copyright
-d[file] --dump-variables[=file]
-D[file] --debug[=file]
-e 'program-text' --source='program-text'
-E file --exec=file
-g --gen-pot
-h --help
-i includefile --include=includefile
-l library --load=library
-L[fatal|invalid] --lint[=fatal|invalid]
-M --bignum
-N --use-lc-numeric
-n --non-decimal-data
-o[file] --pretty-print[=file]
-O --optimize
-p[file] --profile[=file]
-P --posix
-r --re-interval
-s --no-optimize
-S --sandbox
-t --lint-old
-V --version
3、awk内置变量
awk内置变量,引用菜鸟教程《Linux awk 命令》
$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) |
参考资料:
AWK入门指南
Linux awk命令详解