首页 > 编程笔记 > Linux命令

Linux awk命令用法详解

awk 的名字是由 3 个创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首字母组成的,它诞生于 20 世纪 70 年代末期,是一款功能非常强大的文本数据分析处理工具。

在 Linux 系统中,awk 主要用于数据分析和格式化输出,简单来说,awk 会对数据进行分析并将处理结果输出。再讲细一些,首先 awk 会将文件逐行读入,读入的方式与 sed 类似,都是以文件的单行内容作为处理单位;接着将读入的行以空格键或 Tab 键作为分隔符进行切片,切片后的字段叫作“数据字段”,再对数据字段进行各种分析处理;最后输出处理结果,默认输出到屏幕上,也可以输出到文件中。

awk 的操作相对复杂一些,因为它的 3 位创始人在开发此工具的时候就将它定义为“样式扫描和处理语言”,我们可以将它看作是一门语言,就和 Shell 编程语言一样,拥有语言的 awk 无疑是十分强大的,它可以进行样式装入、流控制、数学运算、进程控制语句等,甚至可以使用内置的变量和函数。

awk 的功能非常多,这里我们只需要把它擅长的领域介绍给大家就够用了,其他的功能大家可以自己尝试探索。

awk 的 3 种使用方式如下:
本节以命令行方式为主介绍 awk 命令的使用方式。awk 的语法格式为:
awk [选项] ‘pattern{command}’ 文件名
其中,‘pattern{command}’部分需要用单引号‘’引起来,而 command 部分要用 { } 括起来。

pattern 表示匹配规则,与前面讲的 sed 命令中的匹配方式基本相同,都是用来匹配整个文本数据中符合匹配规则的内容,同样也支持边界和正则表达式。如果不指定匹配规则,则默认匹配文本中所有的行。

command 表示执行命令,就是对数据进行怎样的处理。如果不指定执行命令,则默认输出匹配到的行。

awk 命令的常用选项见下表。

表 1 awk 命令的常用选项
常用选项 说  明
-F 自定义分隔符 指定以自定义分隔符作为分隔符,对文本内容的每行进行切片,awk 命令默认以空格键和 Tab 键作为分隔符。
-f file 从脚本文件中读取 awk 命令,以插入到文件中的方式执行。
-v var=value 自定义变量,在 awk 命令执行之前,先设置一个变量 var,然后给变量 var 赋值 value,变量名与 变量的值自定义即可。

awk 命令的地址边界(与 sed 中的匹配方式基本相同)见下表:

表 2 awk 命令的地址边界
操作符 说  明
不给地址 处理文件的所有行
/pattern/ 处理正则匹配对应的行
!/pattern/ 处理正则不匹配的行
关系表达式 结果为“真”才会被处理
n,m{...} 处理第 n 行至第 m 行的文本内容
BEGIN{ } 在开始处理文本之前执行一些命令(预处理)

常用的 command 命令如下:
数据字段变量如下:
其他内置变量如下:
操作符:
逻辑操作符:
awk 允许一次性执行多条命令。要想在命令行中使用多条命令,只需要在命令之间输入分号(;)即可。awk 在处理文本内容时,会通过字段分隔符对文件的每一行进行切片,切片后的字段叫作“数据字段”,awk会自动给每个数据字段分配一个变量。

看到这里大家可能会产生一种要放弃的想法,这款工具怎么会有这么多的用法,该如何掌握呢?

不要着急,也不要气馁,前面罗列出来的是 awk 的所有用法,但在平常使用中只需要用到其中的一部分。还是那句话,工具很强大也很全面,但是我们只需要掌握它最擅长的功能即可,其他的用法大家有时间可以慢慢钻研。

接下来我们将通过一系列的案例来展示 awk 工具擅长的功能,熟悉工具最好的方法就是多去使用、多去琢磨、多去变通。

【实例 1】打印文件中的每一行。

awk '{ print $0 }' filename

这个命令会打印 filename 文件中的所有行。

【实例 2】打印特定列。

awk '{ print $1 }' filename

假设 filename 是一个以空格或制表符分隔的文本文件,这个命令将只打印每一行的第一个字段。

【实例 3】打印包含特定文本的行。

awk '/pattern/ { print $0 }' filename

这个命令会打印所有包含 "pattern" 文本的行。

【实例 4】使用内置变量和函数

awk '{ if (length($1) > 10) print NR, $1 }' filename

这个命令会打印第一列长度超过 10 个字符的所有行的行号和第一列内容。

相关文章