### awk详细用法小结
#### 一、awk简介与版本
awk是一种强大的文本分析工具,主要用于Linux/Unix系统下的数据处理与报告生成。它支持正则表达式、模式匹配和复杂的文本处理功能,是系统管理员和程序员进行数据处理的利器。在Linux/Unix环境中,awk是一个标准工具,其强大之处在于能够对输入文件的每一行进行模式匹配,并执行相应的操作。
awk最初由Alfred Aho、Brian Kernighan和Peter Weinberger在贝尔实验室开发,随后被GNU项目采用并进行了扩展,形成了gawk(GNU awk)。gawk不仅完全兼容标准的awk,还提供了许多增强功能,使其成为Linux系统上查找和使用的首选awk版本。
#### 二、awk命令格式与选项
##### 2.1 awk命令格式
awk的使用可以通过两种基本方式:
- awk [options]'script' var=value file(s)
- awk [options] -f scriptfile var=value file(s)
其中,script是以单引号括起来的awk程序脚本,而scriptfile则是包含awk脚本的文件路径。
##### 2.2 常见选项
- `-F fs` 或 `--field-separator fs`:指定字段分隔符,用于将输入行分割成字段。
- `-v var=value` 或 `--assign var=value`:定义变量及其初始值。
- `-f scriptfile` 或 `--file scriptfile`:从文件中读取awk脚本。
- `-mf nnn` 和 `-mr nnn`:控制多行记录的处理,为Bell实验室awk的扩展特性。
- `-W compat` 或 `--compat`、`-W traditional` 或 `--traditional`:设置兼容模式,使gawk的行为更接近标准awk或Bell实验室awk。
- `-W copyleft` 或 `--copyleft`、`-W copyright` 或 `--copyright`:显示版权信息。
- `-W help` 或 `--help`、`-W usage` 或 `--usage`:显示帮助信息和命令行选项的简短描述。
- `-W lint` 或 `--lint`:检查awk脚本中的潜在问题,特别是那些不符合POSIX标准的部分。
- `-W lint-old` 或 `--lint-old`:针对非POSIX兼容环境的旧版awk脚本进行检查。
- `-W posix`:强制使用POSIX兼容模式。
- `-W re-interval` 或 `--re-interval`:改变正则表达式的解释,使其更符合grep和POSIX标准。
- `-W source program-text` 或 `--source program-text`:使用program-text作为源代码,而不是从文件读取。
- `-W version` 或 `--version`:显示版本信息。
#### 三、awk模式与动作
awk的核心功能之一是通过模式匹配来选择特定的输入行,并执行相应的动作。模式可以是简单的字符串匹配、正则表达式或者预定义的模式如BEGIN和END。
- **模式匹配**:模式通常以`/pattern/`的形式表示,用于匹配输入行中的特定文本。例如,`$awk '/root/' test`将匹配所有包含"root"的行。
- **条件表达式**:除了模式匹配,awk还支持使用条件表达式如`$3<100`来筛选行,只对满足条件的行执行动作。
- **BEGIN和END模式**:BEGIN模式在任何输入之前执行,常用于初始化变量;END模式在所有输入处理完成后执行,用于清理工作或输出最终结果。
#### 四、awk内置变量
awk提供了一系列内置变量,用于简化数据处理任务:
- `$n`:当前行的第n个字段,其中字段由FS变量指定的分隔符分割。
- `$0`:当前行的完整内容。
- `ARGC`:命令行参数的个数。
- `ARGIND`:当前正在处理的文件在ARGV数组中的索引位置。
- `ARGV`:包含所有命令行参数的数组。
- `CONVFMT`:数值转换格式。
- `ENVIRON`:访问环境变量。
- `ERRNO`:保存最近一个系统调用的错误码。
- `FIELDWIDTHS`:指定字段宽度,用于固定宽度的记录解析。
- `FILENAME`:当前输入文件名。
- `FNR`:当前文件中的行号,独立于总行号NR。
- `FS`:字段分隔符,默认为空白字符。
- `IGNORECASE`:忽略大小写差异,用于模式匹配。
- `NF`:当前行中的字段数量。
- `NR`:总行号,从第一行开始计数。
- `OFMT`:输出数字的格式。
- `OFS`:输出字段分隔符,默认为空格。
- `ORS`:输出行分隔符,默认为换行符。
- `RLENGTH`:匹配长度,当使用match函数时有效。
- `RS`:记录分隔符,默认为换行符。
- `RSTART`:匹配起始位置,当使用match函数时有效。
- `SUBSEP`:子字段分隔符,默认为`\034`。
#### 五、awk运算符
awk支持多种运算符,包括算术运算符、赋值运算符、比较运算符和逻辑运算符,以及正则表达式运算符。
- **算术运算符**:`+`、`-`、`*`、`/`、`%`、`^`。
- **赋值运算符**:`=`、`+=`、`-=`、`*=`、`/=`、`%=`、`^=`、`**=`。
- **关系运算符**:`<`、`>`、`<=`、`>=`、`!=`、`==`。
- **逻辑运算符**:`&&`、`||`。
- **正则表达式运算符**:`~`、`!~`。
- **位运算符**:`<<`、`>>`。
- **一元运算符**:`+`、`-`、`!`。
#### 六、awk数据结构
awk支持数组和关联数组,允许存储和操作复杂的数据结构。
- **数组**:可以使用下标访问数组元素,下标可以是数字或字符串。
- **关联数组**:使用`in`运算符来判断一个键是否存在于数组中。
#### 七、gawk扩展正则表达式
gawk扩展了正则表达式的支持,引入了更多的元字符和特殊序列,如`\b`、`\B`、`\<`、`\>`等,增强了模式匹配的灵活性和精确度。
#### 八、POSIX正则表达式
POSIX标准定义了一套通用的正则表达式语法,gawk也支持这些语法,提供了更广泛的正则表达式匹配能力。
通过上述总结,我们可以看出awk是一个功能极其强大的文本处理工具,它不仅可以用于简单的文本搜索和替换,还能进行复杂的数据分析和报告生成。掌握awk的基本用法和高级技巧,对于提高工作效率和数据处理能力具有重要意义。