awk
awk 是一种强大的文本处理工具,它在Unix-like操作系统中被广泛用于从结构化文本文件中提取、操作和报告生成数据。awk 的名字来源于其创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。它的设计初衷是为了简化处理和分析文本数据,具有灵活性和表达能力,使得从文本中提取有用信息变得非常便捷。
awk的功能
- 字段操作: awk 将输入数据的每行拆分成字段,并用 2、$3 等引用字段。默认情况下,字段由空格或制表符分隔,但你可以通过 -F 参数指定不同的分隔符。
- 内置变量: awk 预定义了许多特殊变量,用于在操作中引用行号、字段数等信息。一些常见的内置变量包括:
NR:当前记录号(行号)。
NF:当前记录的字段数。
$0:当前记录的完整文本内容。
- 条件匹配和处理: awk 允许你基于条件对文本进行过滤和处理。通过在模式部分定义条件,你可以在满足条件的行上执行指定的动作。
- 算术和逻辑操作: 你可以在 awk 中执行各种算术和逻辑操作,从而对数据进行计算和转换。
- 自定义函数: 除了内置的功能,你还可以在 awk 中定义自己的函数,以便在处理数据时进行封装和重用。
- 文件输入和输出: awk 默认从标准输入读取数据,但你可以通过指定文件名作为参数来处理文件。你还可以使用重定向或管道来控制输出的目的地。
- 灵活性: awk 的语法和特性使其非常适合于处理各种文本格式,从日志文件到表格数据等。
- 报告生成: awk 可以根据数据生成报告、摘要和统计信息,使得分析和汇总数据变得更加高效。
- 动作和模式的组合: 多个模式和对应的动作可以组合在一起,实现更复杂的文本处理任务。
awk的工作原理:
- 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
- awk倾向于将一行分成多个"字段"然后再进行处理。
- awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
- 使用awk命令的过程中,可以使用逻辑操作符"&&"表示"与"、"|"表示"或"、"!"表示"非",还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
命令格式:
- awk 选项 '模式或条件 {操作}' 文件1 文件2...
- awk -f 脚本文件 文件1 文件2
内置变量 | 含义 |
---|---|
$0 | 当前处理的行的整行内容 |
$n | 当前处理行的第n个字段(第n列) |
NR | 当前处理的行的行号(序数) |
NF | 当前处理的行的字段个数。$NF代表最后一个字段 |
FS | 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同 |
OFS | 输出内容的列分隔符 |
FILENAME | 被处理的文件名 |
RS | 行分隔符。awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理。预设值是"\n" |
awk的基础用法
打印文章所有内容
打印行内容及其行号
奇偶行打印
文本内容匹配过滤打印
BEGIN打印模式
awk 'BEGIN{...};{...};END{...}' 文件
处理过程:
- 在awk处理指定的文本之前,需要先执行BEGIN{...}模式里的命令操作
- 中间的{...} 是真正用于处理文件的命令操作
- 在awk处理完文件后才会执行END{...}模式里的命令操作。END{ }语句块中,往往会放入打印结果等语句。
指定分隔符打印字段
条件判断打印
awk的精准筛选
选项 | 作用 |
---|---|
$n(> < ==) | 用于对比数值 |
$n~"字符串" | 代表第n个字段 包含 某个字符串的作用 |
$n!~"字符串" | 代表第n个字段 不包含 某个字符串的作用 |
$n=="字符串" | 代表第n个字段 为 某个字符串的作用 |
$n!="字符串" | 代表第n个字段 不为 某个字符串的作用 |
$NF | 代表最后一个字段 |
awk的三元表达式
awk的三元表达式继承了java的用法,格式与Java相似
awk '(条件表达式)?(A表达式或者值):(B表达式或者值)'
awk的分隔符
RS 指定行分隔符
awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理。内置变量RS的预设值是"\n"。
指定输出的列分隔符
FS 输入时的列分隔符。
OFS 输出内容的列分隔符。(n用于激活,否则不生效,n且必须存在)
tr改变分隔符输出
awk改变输出分隔符
直接修改输出
BEGIN中修改
awk结合数组运用
awk打印文件内容去重统计
将文件的字段内容变为定义的数组下标,对其进行匹配读取累加(只有遇到完全一致的才会累加),此时重复的次数在for循环的作用下成为了数组对应下标的元素,
所以输出该下标和元素(就等同于输出重复的字段内容 以及 统计的重复次数)