awk 命令本质上是一种脚本语言和 Linux 中强大的文本操作工具。 它以其创始人阿尔弗雷德的名字命名 一种哦,彼得 W艾因伯格和布赖恩 ķ厄尼根 awk 很受欢迎,因为它能够像处理数字一样容易地处理文本(字符串)。
它逐个扫描一系列输入行或记录,搜索与模式匹配的行。 当找到匹配时,可以执行操作。 它是一种模式动作语言。
awk 的输入可以来自文件、重定向和管道,也可以直接来自标准输入。
目录
- 术语
- awk 的标准格式
- awk 命令的基本用法
- 使用 awk 处理来自命令行的输入
- 使用字段从文件打印
- 玩 awk 分隔符
- awk 中的布尔运算
- 使用 awk 命令匹配字符串文字
- awk 中的用户定义变量
- 用 awk 命令计数
- 结论
术语
在深入学习本教程之前,让我们先了解一些基本术语。 这将使您更容易更好地理解这个概念。
1. 记录
awk 将每一行视为一条记录。
- RS 用于提及记录分隔符。 默认情况下,RS 设置为换行符。
- NR 是跟踪记录号的变量。 它的值等于正在处理的记录。 NR 可以假定为默认场景中的行号。
2. 字段
每条记录都被分成多个字段。 这意味着每一行都被分成多个字段。
- FS 是字段分隔符。 默认情况下,FS 设置为空白。 这意味着每个单词都是一个字段。
- NF 是特定记录中的字段数。
字段编号为:
- 整条线 0 美元。
- 第一个字段 1 美元。
- 第二个字段 2 美元。
- $n 用于第 n 个字段。
- 最后一个字段的 $NF。
- $NF-1 用于倒数第二个字段。
awk 的标准格式
awk 命令的标准格式是:
$ awk ' BIGIN{/instructions/} /pattern/ {ACTIONS} END{/instructions}' file_name
- 模式-动作对将包含在单引号(’)中
- BEGIN 和 END 是可选的,用于提及在处理输入之前和之后要执行的操作。
- 该模式表示如果满足导致执行操作的条件
- 该操作指定了匹配成功时要执行的精确命令集。
- 如果输入来自文件,则要指定 file_name。
awk 命令的基本用法
awk 可用于根据文本中的某些模式将消息打印到终端。 如果您运行 awk 命令而没有任何模式并且只运行一个打印命令,那么每次您按 Enter 键时 awk 都会打印该消息。 发生这种情况是因为 awk 命令需要来自命令行界面的输入。
$ awk '{print "This is how awk command is used for printing"}'
使用 awk 处理来自命令行的输入
我们在前面看到 example 如果没有提到输入源,那么 awk 只是从命令行获取输入。
awk 下的输入被视为记录的集合,每条记录又是字段的集合。 我们可以使用它来实时处理输入。
$ awk '$3=="linux" {print "That is amazing!", $1}'
此代码查找行中第三个单词是“linux”的模式。 当找到匹配项时,它会打印消息。 在这里,我们引用了同一行的第一个字段。 在继续之前,让我们创建一个文本文件用作输入。
这可以在 linux 中使用 cat 命令来完成。

该文件的文本是:
First 200 Second 300 Third 150 Fourth 300 Fifth 250 Sixth 500 Seventh 100 Eight 50 Ninth 70 Tenth 270
这些可能是不同客户的卢比会费,名为 First、Second ……等等。
使用字段从文件打印
可以使用 awk 打印来自文件的输入。 我们可以参考不同的字段以花哨的方式打印输出。
$ awk '{print $1, "owes", $2}' rec.txt

$1 和 $2 分别用于引用字段一和字段二。 我们输入文件中的这些是每行中的第一个和第二个单词。 我们没有在此命令中提到任何模式,因此 awk 命令对每条记录运行该操作。 awk 的默认模式是“”,它匹配每一行。
玩 awk 分隔符
awk 中有三种类型的分隔符。
- OFS:输出字段分隔符
- FS:字段分隔符
- RS:记录分隔符
1.输出字段分隔符(OFS)
您可以注意到默认情况下,打印命令用空格分隔输出字段。 这可以通过更改 OFS 来更改。
$ awk 'OFS=" owes " {print $1,$2}' rec.txt

实现与前一种情况相同的输出。 默认输出字段分隔符已从空格更改为“欠”。 然而,这并不是改变 OFS 的最佳方式。 应在 awk 命令的 BEGIN 部分更改所有分隔符。
2. 场分离器 (FS)
字段分隔符可以通过改变 FS 的值来改变。 默认情况下,FS 设置为空白。 我们使用以下数据创建了另一个文件。 这里名称和金额用’-‘分隔
First-200 Second-300 Third-150 Fourth-300 Fifth-250 Sixth-500 Seventh-100 Eight-50 Ninth-70 Tenth-270
$ awk 'FS="-" {print $1}' rec-sep.txt

您可以注意到输出的第一行是错误的。 对于第一条记录,awk 似乎无法分隔字段。 这是因为我们在操作部分提到了更改字段分隔符的语句。 第一次运行操作部分是在处理完第一条记录之后。 在这种情况下,First-200 被读取并使用字段分隔符作为空格进行处理。
正确方法:
$ awk 'BEGIN {FS="-"} {print $1}' rec_1.txt

现在我们得到了正确的输出。 第一条记录已成功分离。 放置在 BEGIN 部分的任何语句在处理输入之前运行。 BEGIN 部分最常用于在处理输入之前打印消息。
3.记录分隔符(RS)
第三种分隔符是记录分隔符。 默认情况下,记录分隔符设置为换行符。 记录分隔符可以通过改变 RS 的值来改变。 如果输入是 CSV(逗号分隔值)文件,更改 RS 很有用。
为了 example 如果输入是:
First-200,Second-300,Third-150,Fourth-300,Fifth-250,Sixth-500,Seventh-100,Eight-50,Ninth-70,Tenth-270
这与上面的输入相同,但采用逗号分隔格式。
我们可以通过更改 RS 字段来处理这样的文件。
$ awk 'BEGIN {FS="-"; RS=","; OFS=" owes Rs. "} {print $1,$2}' rec_2.txt

awk 中的布尔运算
布尔运算可以用作模式。 可以使用不同的字段值进行比较。 awk 的工作方式类似于 if-then 命令。 在我们的数据中,我们可以找到超过卢比的客户。 200 到期。
$ awk '$2>200 {print $1, "owes Rs.",$2}' rec.txt

这通过将每条记录的第二个字段与 200 进行比较并在条件为真时打印来为我们提供列表。
使用 awk 命令匹配字符串文字
由于 awk 与字段一起使用,我们可以使用它来为我们带来好处。 运行 ls -l 命令会给出当前目录中所有文件的列表以及附加信息。

awk 命令可以与 ls -l 一起使用,以找出在 5 月份创建的文件。 $6 是显示文件创建月份的字段。 我们可以使用它并将该字段与字符串“May”匹配。
$ ls -l | awk '$6=="May" {print $9}'

awk 中的用户定义变量
要执行其他操作,可以在 awk 中定义变量。 为了 example 要计算会费大于 200 的人员列表中的总和,我们可以定义一个 sum 变量来计算总和。
$ awk 'BEGIN {sum=0} $2>200 {sum=sum+$2; print $1} END{print sum}' rec.txt

sum 变量在 BEGIN 部分初始化,在 action 部分更新,并在 END 部分打印。 只有当模式部分中提到的条件为真时,才会使用操作部分。 由于每行都会检查模式,因此该结构作为循环工作,每次满足条件时都会执行更新。
用 awk 命令计数
awk 命令还可以用来统计行数、字数,甚至字符数。 让我们从使用 awk 命令计算行数开始。
计算行数
可以通过在 END 部分打印出 NR 变量来打印行数。 NR 用于存储当前记录号。 由于在处理完所有记录后访问 END 部分,因此 END 部分中的 NR 将包含记录的总数。
$ awk 'END { print NR }' rec.txt

计算字数
要获得单词的数量,可以使用 NF。 NF 是每条记录中的字段数。 如果对所有记录求和NF,就可以得到字数。 在命令中,c 用于统计字数。 对于每一行,该行中的字段总数被添加到 c。 在 END 部分,打印 c 将给出总字数。
$ awk 'BEGIN {c=0} {c=c+NF} END{print c}' rec.txt

计算字符数
每行的字符数可以通过使用 awk 的内置长度函数获得。 $0 用于获取整个记录。 length($0) 将给出该记录中的字符数。
awk '{ print "number of characters in line", NR,"=" length($0) }' rec.txt

结论
awk 命令可用于执行非常强大的文本操作。 直接访问字段的便利性为 awk 提供了优于 sed 的主要优势。 如前所述,awk 不仅是一个命令行工具,还是一种强大的脚本语言。 要了解有关 awk 的更多信息,请参阅 这.