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 的语法格式为:
pattern 表示匹配规则,与前面讲的 sed 命令中的匹配方式基本相同,都是用来匹配整个文本数据中符合匹配规则的内容,同样也支持边界和正则表达式。如果不指定匹配规则,则默认匹配文本中所有的行。
command 表示执行命令,就是对数据进行怎样的处理。如果不指定执行命令,则默认输出匹配到的行。
awk 命令的常用选项见下表。
awk 命令的地址边界(与 sed 中的匹配方式基本相同)见下表:
常用的 command 命令如下:
数据字段变量如下:
其他内置变量如下:
操作符:
逻辑操作符:
awk 允许一次性执行多条命令。要想在命令行中使用多条命令,只需要在命令之间输入分号(;)即可。awk 在处理文本内容时,会通过字段分隔符对文件的每一行进行切片,切片后的字段叫作“数据字段”,awk会自动给每个数据字段分配一个变量。
看到这里大家可能会产生一种要放弃的想法,这款工具怎么会有这么多的用法,该如何掌握呢?
不要着急,也不要气馁,前面罗列出来的是 awk 的所有用法,但在平常使用中只需要用到其中的一部分。还是那句话,工具很强大也很全面,但是我们只需要掌握它最擅长的功能即可,其他的用法大家有时间可以慢慢钻研。
接下来我们将通过一系列的案例来展示 awk 工具擅长的功能,熟悉工具最好的方法就是多去使用、多去琢磨、多去变通。
【实例 1】打印文件中的每一行。
【实例 2】打印特定列。
【实例 3】打印包含特定文本的行。
【实例 4】使用内置变量和函数
在 Linux 系统中,awk 主要用于数据分析和格式化输出,简单来说,awk 会对数据进行分析并将处理结果输出。再讲细一些,首先 awk 会将文件逐行读入,读入的方式与 sed 类似,都是以文件的单行内容作为处理单位;接着将读入的行以空格键或 Tab 键作为分隔符进行切片,切片后的字段叫作“数据字段”,再对数据字段进行各种分析处理;最后输出处理结果,默认输出到屏幕上,也可以输出到文件中。
awk 的操作相对复杂一些,因为它的 3 位创始人在开发此工具的时候就将它定义为“样式扫描和处理语言”,我们可以将它看作是一门语言,就和 Shell 编程语言一样,拥有语言的 awk 无疑是十分强大的,它可以进行样式装入、流控制、数学运算、进程控制语句等,甚至可以使用内置的变量和函数。
awk 的功能非常多,这里我们只需要把它擅长的领域介绍给大家就够用了,其他的功能大家可以自己尝试探索。
awk 的 3 种使用方式如下:
- 命令行方式:使用 awk 工具以命令行的方式在 Linux 操作系统的终端中去执行操作。
- Shell 脚本方式:将所有的 awk 命令插入文件中,并将此文件赋予执行权限,使用 awk 命令解释器作为脚本的首行,通过执行脚本的形式执行文件中所有的 awk 命令。
- 插入文件中:将所有的 awk 命令插入一个单独的文件中,再通过 awk 的 -f 选项调用此文件。
本节以命令行方式为主介绍 awk 命令的使用方式。awk 的语法格式为:
awk [选项] ‘pattern{command}’ 文件名其中,‘pattern{command}’部分需要用单引号‘’引起来,而 command 部分要用 { } 括起来。
pattern 表示匹配规则,与前面讲的 sed 命令中的匹配方式基本相同,都是用来匹配整个文本数据中符合匹配规则的内容,同样也支持边界和正则表达式。如果不指定匹配规则,则默认匹配文本中所有的行。
command 表示执行命令,就是对数据进行怎样的处理。如果不指定执行命令,则默认输出匹配到的行。
awk 命令的常用选项见下表。
常用选项 | 说 明 |
---|---|
-F 自定义分隔符 | 指定以自定义分隔符作为分隔符,对文本内容的每行进行切片,awk 命令默认以空格键和 Tab 键作为分隔符。 |
-f file | 从脚本文件中读取 awk 命令,以插入到文件中的方式执行。 |
-v var=value | 自定义变量,在 awk 命令执行之前,先设置一个变量 var,然后给变量 var 赋值 value,变量名与 变量的值自定义即可。 |
awk 命令的地址边界(与 sed 中的匹配方式基本相同)见下表:
操作符 | 说 明 |
---|---|
不给地址 | 处理文件的所有行 |
/pattern/ | 处理正则匹配对应的行 |
!/pattern/ | 处理正则不匹配的行 |
关系表达式 | 结果为“真”才会被处理 |
n,m{...} | 处理第 n 行至第 m 行的文本内容 |
BEGIN{ } | 在开始处理文本之前执行一些命令(预处理) |
常用的 command 命令如下:
- print:打印、输出(主要)。
- printf:格式化输出。
数据字段变量如下:
- $0:表示整个当前行。
- $1:表示文本行中的第 1 个数据字段。
- $2:表示文本行中的第 2 个数据字段。
- $n:表示文本行中的第 n 个数据字段。
其他内置变量如下:
- FS:输入字段分隔符,默认为空格。
- OFS:输出字段分隔符,默认为空格。
- RS:输入记录分隔符,默认为换行符 \n。
- ORS:输出记录分隔符,默认为换行符 \n。
- NF:字段数量。
- NR:记录号。
- NFR:多个文件分别计数,记录号。
- FILENAME:当前文件名。
- FIELDWIDTHS:定义数据字段的宽度。
- ARGC:命令行的参数。
- ARGV:数组,保存的是命令行给定的各参数。
操作符:
- 算数操作符:+,-,/,*。
- 复制操作符:=,+=,-=,/=,++,--。
- 比较操作符:>,<,>=,<=,!=,==。
逻辑操作符:
- &&:与。
- ||:或。
- !:非。
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 个字符的所有行的行号和第一列内容。