0 前言
在编写Linux Shell脚本的过程中,我们经常要对Linux命令执行的结果进行分析和提取,Linux也在文本分析和提取这方面提供了不少的命令。比如我们之前研究过的cut命令。
Linux shell编程学习笔记43:cut命令
除了cut命令,我们还需要继续研究其他相关的命令。
今天我们先研究 awk命令。
1 awk命令的由来
AWK 命令是取了三位创建人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 姓氏(Family Name) 的首字符来构成。
实际上 AWK 拥有自己的程序设计语言 ——“样式扫描和处理语言”,这种语言允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
2 awk命令的功能、格式和选项说明
我们可以使用 awk --help命令查看 awk 命令的帮助信息。
purpleEndurer @ bash ~ $ awk --help
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options: GNU long options: (standard)
-f progfile --file=proTo report bugs, see node `Bugs' in `', which is
section `Reporting Problems and Bugs' in the printed version.gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.Examples:
gawk '{ sum += $1 }; END { print sum }' file
gawk -F: '{ print $1 }' /etc/passwdpurpleEndurer @ bash ~ $
2.1 awk命令的功能
awk是处理文本文件的一个应用程序,它依次处理文件的每一行,并读取里面的每一个字段。
对于日志、CSV 那样的每行格式相同的文本文件,awk可能是最方便的工具。
2.2 awk命令的格式
awk [选项] -f 脚本文件 [--] 文件 ...
或
awk [选项] [--] '程序' 文件 ...
2.3 awk命令的选项
POSIX 选项 |
GNU 长选项: (标准 ) |
功能 |
备注 |
-f progfile |
--file=progfile |
从脚本文件中读取awk程序源代码,而不是从第一个 非选项 参数中读取。此选项可以多次给出;AWK 程序由每个指定源文件的内容串联组成。 |
以 -f 命名的文件被视为开头有“@namespace ”awk“。 |
-F fs |
--field-separator=fs |
指定输入文件折分符,fs是一个字符串或者是一个正则表达式,如-F |
|
-v var=val |
--assign=var=val |
在程序开始执行之前,将变量 var 设置为值 val |
此类变量值在 BEGIN 规则中可用。 使用 -v 设置内置变量的值可能会导致令人惊讶的结果。AWK 将根据需要重置这些变量的值,可能会忽略您可能给出的任何初始值。 |
短选项 |
GNU长选项: (扩展) |
功能 |
-b |
--characters-as-bytes |
使 gawk 将所有输入数据视为单字节字符。此外,所有使用 print 或 printf 写入的输出都被视为单字节字符。 通常,gawk 遵循 POSIX 标准,并尝试根据当前语言环境处理其输入数据。这通常涉及将多字节字符转换为宽字符(内部),如果输入数据不包含有效的多字节字符,则可能会导致问题或混淆。此选项是告诉 gawk “放开我的数据!“ |
-c |
--traditional |
指定兼容模式,在该模式下,禁用 awk 语言的 GNU 扩展,以便 gawk 的行为与 BWK 一样 |
-C |
--copyright |
打印版权信息 |
-d[file] |
--dump-variables[=file] |
将全局变量、其类型和最终值的排序列表打印到文件中。如果未提供任何文件,此列表将打印到当前目录中名为 awkvars.out 的文件中。 如果提供了 file,则 -d 和 file 之间不允许有空格。 |
-e 'program-text' |
--source='program-text' |
使用program-text作为源代码,可与-f命令混用。 此选项允许您将文件中的源代码与您在命令行中输入的源代码混合使用。 当您要从命令行程序使用的库函数时,这特别有用 |
-E file |
--exec=file |
与 -f 类似,从文件中读取 awk 程序文本。 与 -f 有两个区别: 此选项终止选项处理;命令行上的任何其他内容都直接传递给 AWK 程序。 对于通过 URL 传递参数的万维网 CGI 应用程序,此选项尤其必要。用此选项可防止恶意(或其他)用户将选项、分配或 awk 源代码(通过 -e)传递给 CGI 应用程序。 此选项应与 '#!' 脚本一起使用(请参阅可执行 awk 程序),如下所示: #!/usr/local/bin/gawk -E |
-g |
--gen-pot |
分析源程序,并在标准输出上为所有标记为翻译的字符串常量生成一个 GNU gettext 可移植对象模板文件 |
-h |
--help |
显示帮助信息 |
-L [fatal] |
--lint[=fatal] |
警告可疑或不可移植到其他 awk 实现的构造。如果提供了值,则 -L 和值之间不允许有空格。当 gawk 第一次读取您的程序时,会发出一些警告。其他的则在运行时发出,因为程序正在执行。 |
-n |
--non-decimal-data |
启用输入数据中八进制和十六进制值的自动解释。 注意:此选项可能会严重破坏旧程序。请小心使用。另请注意,此选项可能会在 gawk 的未来版本中消失。 |
-O |
--optimize |
启用 gawk 对程序内部表示的默认优化。目前,这仅包括简单的恒定折叠。 默认情况下,优化处于启用状态。此选项主要用于向后兼容。但是,它可用于取消早期 -s 选项的效果(请参阅此列表的后面部分)。 |
-p[file] |
--profile[=file] |
启用 awk 程序的分析。 暗示 --no-optimize。默认情况下,配置文件在名为 awkprof.out 的文件中创建。可选的 file 参数允许您为配置文件指定不同的文件名。如果提供了 file,则 -p 和 file 之间不允许有空格。 配置文件在左边距包含程序中每个语句的执行计数,以及每个函数的函数调用计数。 |
-P |
--posix |
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符和=不能代替^和^=;fflush无效。 |
-r |
--re-interval |
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。 |
-S |
--sandbox |
禁用 system() 函数、使用 getline 的输入重定向、使用 print 和 printf 的输出重定向以及动态扩展。此外,不允许向 ARGV 添加 gawk 开始运行时不存在的文件名。当您想要从可疑来源运行 awk 脚本并需要确保脚本无法访问您的系统(指定的输入数据文件除外)时,这特别有用。 |
-t |
--lint-old |
打印关于不能向传统unix平台移植的结构的警告。 |
-V |
--version |
打印版本信息。 |
2.4 其它说明
几乎所有 Linux 系统都自带awk这个程序。
awk有3个不同版本: awk、nawk和gawk,如果没有作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
3 awk命令基本用法使用实例
3.1 awk -C:打印版权信息
purpleEndurer @ bash ~ $ awk -C
Copyright (C) 1989, 1991-2012 Free Software Foundation.This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.You should have received a copy of the GNU General Public License
along with this program. If not, see http:///licenses/.
purpleEndurer @ bash ~ $
3.2 awk -V:打印版本信息
purpleEndurer @ bash ~ $ awk -V
GNU Awk 4.0.2
Copyright (C) 1989, 1991-2012 Free Software Foundation.This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.You should have received a copy of the GNU General Public License
along with this program. If not, see http:///licenses/.
purpleEndurer @ bash ~ $