awk 教程 – 7 个 awk 打印示例
这是新的 awk 教程系列的第一篇文章。我们将在接下来的时间里内发布几篇关于 awk 的文章,这些文章将通过实际示例介绍 awk 的所有功能。
在本文中,让我们回顾一下基本的 awk 工作方法以及 7 个实用的 awk 打印示例。
awk 介绍和打印操作
awk 是一种编程语言,可以轻松操作结构化数据并生成格式化报告。 Awk 代表其作者的名字“Aho、Weinberger 和 Kernighan”
awk 主要用于模式扫描和处理。它搜索一个或多个文件以查看它们是否包含与指定模式匹配的行,然后执行相关操作。
awk 的一些关键特性是:
- awk 将文本文件视为记录和字段。
- 与常见的编程语言一样,Awk 有变量、条件和循环
- awk 有算术和字符串运算符。
- awk 可以生成格式化报告
awk 从文件或其标准输入读取数据,并输出到其标准输出。 awk 不能处理非文本文件。
语法
awk '/search pattern1/ {Actions} /search pattern2/ {Actions}' file
在上面的 awk 语法中:
- 搜索模式是一个正则表达式。
- Actions——要执行的语句。
- 在 awk 中可以使用多种模式和操作。
- file——输入文件。
- 程序周围的单引号是为了避免 shell 不解释它的任何特殊字符。
awk 工作方法
awk 一次读取一行输入文件。
- 对于每一行,它以给定的顺序与给定的模式匹配,如果匹配执行相应的操作。
- 如果没有模式匹配,则不会执行任何操作。
- 在上述语法中,搜索模式或操作都是可选的,但不能同时使用。
- 如果没有给出搜索模式,则 Awk 对输入的每一行执行给定的操作。
- 如果未给出操作,则打印与给定模式匹配的所有行,这是默认操作。
- 没有任何动作的空括号什么都不做。 它不会执行默认的打印操作。
- Actions 中的每条语句都应该用分号分隔。
让我们创建具有以下内容的 employee.txt 文件,将在下面提到的例子中使用。
employee.txt
100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000
awk 示例 1. awk 的默认行为
默认情况下,Awk 打印文件中的每一行。
$ awk '{print;}' employee.txt
在上面的示例中没有给出模式。 因此,这些操作适用于所有行。
默认情况下,不带任何参数的操作打印会打印整行。 所以它成功打印文件的所有行。 Action必须用大括号括起来。
awk 示例 2. 打印与模式匹配的行
$ awk '/Thomas/
> /Nisha/' employee.txt
在上面的例子中,它打印出所有与“Thomas”或“Nisha”匹配的行。 它有两种模式。 awk 接受任意数量的模式,但每个集合(模式及其对应的操作)都必须用换行符分隔。
awk 示例 3. 仅打印特定字段
awk 有许多内置变量。 对于每条记录,即行,它默认分割由空白字符分隔的记录并将其存储在 $n
变量中。 如果该行有 4 个单词,它将存储在 $1、**$2、$3** 和 $4 中。 $0 代表整行。 NF 是一个内置变量,表示记录中的字段总数。
$ awk '{print $2,$5;}' employee.txt
在上面的例子中,$2
和 $5
分别代表 Name 和 Salary。 我们也可以使用 $NF
获得薪水,其中 $NF
代表最后一个字段。 在 print
语句中,,
是一个连接符。
awk 示例 4. 初始化和最终操作
awk 有两个重要的模式,由关键字 BEGIN 和 END 指定。
语法
BEGIN { Actions} {ACTION} # Action for everyline in a file END { Actions } # 这里是Awk注释
BEGIN 部分中指定的操作将在开始从输入读取行之前执行。
END 动作将在完成读取和处理输入的行后执行。
$ awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";}
{print $2,"\t",$3,"\t",$4,"\t",$NF;}
END{print "Report Generated\n--------------";
}' employee.txt
在上面的示例中,它打印报告的标题和最后一个文件。
awk 示例 5. 查找员工 id 大于 200 的员工
$ awk '$1 >200' employee.txt
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
在上面的示例中,第一个字段 $1
是员工 ID。 因此,如果 $1
大于 200,则只需执行默认打印操作即可打印整行。
awk 示例 6. 打印技术部门的员工列表
现在部门名称作为第四个字段可用,因此需要检查 $4
是否与字符串“Technology”匹配,如果是则打印该行。
$ awk '$4 ~/Technology/' employee.txt
运算符 ~
用于与正则表达式进行比较。 如果它与默认操作匹配,即打印整行将被执行。
awk 示例 7. 打印技术部门的员工人数
下面的例子,检查部门是否是 Technology,如果是,则在 Action 中增加 count
变量,该变量在 BEGIN 部分初始化为零。
$ awk 'BEGIN { count=0;}
$4 ~ /Technology/ { count++; }
END { print "Number of employees in Technology Dept =",count;}' employee.txt
然后在流程结束时,只需打印 count
的值,它会为我们提供技术部门的员工人数。
相关文章
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 Linux 中更新 YUM
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
本文介绍了 Linux 中的 yum update 命令。本文将教我们如何在 Linux 中更新 YUM,以及如何在 Linux 系统上安装、更新、删除、查找和管理包。
在 Linux 中安装 Deb 文件
发布时间:2023/05/04 浏览次数:130 分类:操作系统
-
本文介绍如何在 Linux 中安装 deb 文件。在这篇 Linux 文章中,我们将学习如何在 Linux 系统上安装 .deb(Debian 软件包)文件。 我们还将看到如何在安装后删除 .deb 文件。
Linux 中的 lsof 命令
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
在这篇 Linux 文章中,我们将了解 Linux 操作系统中的 lsof 命令。 我们将看到如何在 Linux 中将此命令用于不同目的。
Linux 解决不能执行二进制文件问题
发布时间:2023/05/04 浏览次数:187 分类:操作系统
-
在本文中,我们将学习如何在 Linux 中执行二进制文件。 如果 Linux 无法执行二进制文件,我们还将学习如何解决错误。
Linux 中错误 Mesg: Ttyname Failed: Inappropriate Ioctl for Device Error
发布时间:2023/05/04 浏览次数:145 分类:操作系统
-
本文介绍如何在 Linux 中解决 mesg: ttyname failed: inappropriate ioctl for device 错误。在 Linux 中,这个错误是由于默认的 vagrant 配置 config.ssh.shell 与 bash -l 交互导致的。
Linux 中的 ps aux 命令
发布时间:2023/05/04 浏览次数:69 分类:操作系统
-
本篇文章将讨论 Linux 中的 ps aux 命令。如果将 aux 快捷方式与 ps 命令一起使用,它将显示用户需要的最多信息,并可以为您提供系统运行进程的当前状态。
Linux 中的 NTP
发布时间:2023/05/04 浏览次数:137 分类:操作系统
-
本篇文章将讨论 Linux 中的 ntp。NTP 是大多数 IT 基础设施使用的核心协议。 使用它的目的是同步日期和时间信息。
在 Linux 中计算文件中的唯一行
发布时间:2023/05/04 浏览次数:70 分类:操作系统
-
计算文件中的唯一行是 Linux 中的一项常见任务,可以使用多种不同的工具和方法来执行此操作。使用 sort 和 uniq 命令计算文件中的唯一行数