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 文件,将在下面提到的例子中使用。

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

awk 教程 – 7 个 awk 打印示例

在上面的示例中没有给出模式。 因此,这些操作适用于所有行。

默认情况下,不带任何参数的操作打印会打印整行。 所以它成功打印文件的所有行。 Action必须用大括号括起来。

awk 示例 2. 打印与模式匹配的行

$ awk '/Thomas/
> /Nisha/' employee.txt

awk 教程 – 7 个 awk 打印示例

在上面的例子中,它打印出所有与“Thomas”或“Nisha”匹配的行。 它有两种模式。 awk 接受任意数量的模式,但每个集合(模式及其对应的操作)都必须用换行符分隔。

awk 示例 3. 仅打印特定字段

awk 有许多内置变量。 对于每条记录,即行,它默认分割由空白字符分隔的记录并将其存储在 $n 变量中。 如果该行有 4 个单词,它将存储在 $1、**$2$3** 和 $4 中。 $0 代表整行。 NF 是一个内置变量,表示记录中的字段总数。

$ awk '{print $2,$5;}' employee.txt

awk 教程 – 7 个 awk 打印示例

在上面的例子中,$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 教程 – 7 个 awk 打印示例

在上面的示例中,它打印报告的标题和最后一个文件。

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

awk 教程 – 7 个 awk 打印示例

在上面的示例中,第一个字段 $1 是员工 ID。 因此,如果 $1 大于 200,则只需执行默认打印操作即可打印整行。

awk 示例 6. 打印技术部门的员工列表

现在部门名称作为第四个字段可用,因此需要检查 $4 是否与字符串“Technology”匹配,如果是则打印该行。

$ awk '$4 ~/Technology/' employee.txt

awk 教程 – 7 个 awk 打印示例

运算符 ~ 用于与正则表达式进行比较。 如果它与默认操作匹配,即打印整行将被执行。

awk 示例 7. 打印技术部门的员工人数

下面的例子,检查部门是否是 Technology,如果是,则在 Action 中增加 count 变量,该变量在 BEGIN 部分初始化为零。

$ awk 'BEGIN { count=0;}
$4 ~ /Technology/ { count++; }
END { print "Number of employees in Technology Dept =",count;}' employee.txt

awk 教程 – 7 个 awk 打印示例

然后在流程结束时,只需打印 count 的值,它会为我们提供技术部门的员工人数。