AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
实际上 AWK 的确拥有自己的语言: AWK程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
awk [选项参数] -f scriptfile var=value file(s)
参数 | 解析 |
---|---|
-F fs or --field-separator fs | 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。 |
-v var=value or --asign var=value | 赋值一个用户定义变量。 |
-f scripfile or --file scriptfile | 从脚本文件中读取awk命令。 |
-mf nnn and -mr nnn | 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 |
-W compact or --compat, -W traditional or --traditional | 在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。 |
-W copyleft or --copyleft, -W copyright or --copyright | 打印简短的版权信息。 |
-W help or --help, -W usage or --usage | 打印全部awk选项和每个选项的简短说明。 |
-W lint or --lint | 打印不能向传统unix平台移植的结构的警告。 |
-W lint-old or --lint-old | 打印关于不能向传统unix平台移植的结构的警告。 |
-W posix | 打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符和=不能代替和=;fflush无效。 |
-W re-interval or --re-inerval | 允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。 |
-W source program-text or --source program-text | 使用program-text作为源代码,可与-f命令混用。 |
-W version or --version | 打印bug报告信息的版本。 |
[root@localhost /]# cat test.txt
This is a test
hello world
以空格为分隔符输出第一列和第二列
[root@localhost /]# awk -F' ' '{print $1,$2}' test.txt
This is
hello world
以空格分隔后输出的结果在以:分隔
[root@localhost /]# awk -F '[ :]' '{print $1,$2}' test.txt
输出最后一行内容
[root@localhost /]# awk 'END{printf $0}'
参数 | 详解 |
---|---|
$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) |
#输出顺序号 NR, 匹配文本行号
[root@localhost /]# awk '{print NR,FNR,$1,$2,$3}' test.txt
1 1 This is a
2 2 hello world