文本三剑客:awk

40 阅读3分钟

awk

awk 是一种强大的文本处理工具,它在Unix-like操作系统中被广泛用于从结构化文本文件中提取、操作和报告生成数据。awk 的名字来源于其创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。它的设计初衷是为了简化处理和分析文本数据,具有灵活性和表达能力,使得从文本中提取有用信息变得非常便捷。

awk的功能

  • 字段操作: awk 将输入数据的每行拆分成字段,并用 11、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的基础用法

打印文章所有内容

image.png

打印行内容及其行号

image.png

奇偶行打印

image.png

文本内容匹配过滤打印

image.png

BEGIN打印模式

awk 'BEGIN{...};{...};END{...}' 文件

处理过程:

  • 在awk处理指定的文本之前,需要先执行BEGIN{...}模式里的命令操作
  • 中间的{...} 是真正用于处理文件的命令操作
  • 在awk处理完文件后才会执行END{...}模式里的命令操作。END{ }语句块中,往往会放入打印结果等语句。

image.png

指定分隔符打印字段

image.png

条件判断打印

image.png

awk的精准筛选

选项作用
$n(> < ==)用于对比数值
$n~"字符串"代表第n个字段 包含 某个字符串的作用
$n!~"字符串"代表第n个字段 不包含 某个字符串的作用
$n=="字符串"代表第n个字段 为 某个字符串的作用
$n!="字符串"代表第n个字段 不为 某个字符串的作用
$NF代表最后一个字段

image.png

awk的三元表达式

awk的三元表达式继承了java的用法,格式与Java相似

awk '(条件表达式)?(A表达式或者值):(B表达式或者值)'

image.png

awk的分隔符

RS 指定行分隔符

awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理。内置变量RS的预设值是"\n"。

image.png

指定输出的列分隔符

FS 输入时的列分隔符。

OFS 输出内容的列分隔符。(n=n=n用于激活,否则不生效,n且必须存在)

tr改变分隔符输出

image.png

awk改变输出分隔符

直接修改输出

image.png

BEGIN中修改

image.png

awk结合数组运用

image.png

image.png

awk打印文件内容去重统计

将文件的字段内容变为定义的数组下标,对其进行匹配读取累加(只有遇到完全一致的才会累加),此时重复的次数在for循环的作用下成为了数组对应下标的元素,

所以输出该下标和元素(就等同于输出重复的字段内容 以及 统计的重复次数)

image.png