awk 介绍教程–7 个 awk 打印示例

举报
Tiamo_T 发表于 2022/01/20 10:00:46 2022/01/20
【摘要】 在本文中,让我们了解一下基本的 awk 工作方法以及 7 个实用的 awk 打印示例。

在本文中,让我们了解一下基本的 awk 工作方法以及 7 个实用的 awk 打印示例。

注意:请务必查看之前的Sed 教程系列

awk 介绍和打印操作

awk 是一种编程语言,可以轻松操作结构化数据并生成格式化报告。

awk 主要用于模式扫描和处理。它搜索一个或多个文件以查看它们是否包含与指定模式匹配的行,然后执行相关操作。

awk 的一些关键特性是:

  • awk 将文本文件视为记录和字段。
  • 与常见的编程语言一样,Awk 有变量、条件和循环
  • awk 有算术和字符串运算符。
  • awk 可以生成格式化报告

awk 从文件或其标准输入读取数据,并输出到其标准输出。awk 不能与非文本文件相处。

Syntax:

awk '/search pattern1/ {Actions}
     /search pattern2/ {Actions}' file

在上面的 awk 语法中:


  • 搜索模式是一个正则表达式。
  • 行动——要执行的语句。
  • 在 awk 中可以使用多种模式和操作。
  • 文件——输入文件。
  • 程序周围的单引号是为了避免 shell 不解释它的任何特殊字符。

awk 工作方法

  1. awk 一次读取一行输入文件。
  2. 对于每一行,它以给定的顺序与给定的模式匹配,如果匹配执行相应的操作。
  3. 如果没有模式匹配,则不会执行任何操作。
  4. 在上述语法中,搜索模式或操作都是可选的,但不能同时使用。
  5. 如果没有给出搜索模式,则 Awk 对输入的每一行执行给定的操作。
  6. 如果未给出操作,则打印与给定模式匹配的所有行,这是默认操作。
  7. 没有任何动作的空括号什么都不做,它不会执行默认的打印操作。
  8. Actions 中的每条语句都应该用分号分隔。

让我们创建具有以下内容的employee.txt 文件,将在下面提到的示例中使用。

$cat 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
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 示例 2. 打印与模式匹配的行。

$ awk '/Thomas/
> /Nisha/' employee.txt
100  Thomas  Manager    Sales       $5,000
400  Nisha   Manager    Marketing   $9,500

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

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

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

$ awk '{print $2,$5;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000

$ awk '{print $2,$NF;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000

在上面的例子中,$2 和 $5 分别代表 Name 和 Salary。我们也可以使用 $NF 获得薪水,其中 $NF 代表最后一个字段。在 print 语句中,',' 是一个连接符。

awk 示例 4. 初始化和最终操作

awk 有两个重要的模式,由关键字 BEGIN 和 END 指定。

Syntax: 

BEGIN { Actions}
{ACTION} # Action for everyline in a file
END { Actions }

# is for comments in 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
Name	Designation	Department	Salary
Thomas 	 Manager 	 Sales 	         $5,000
Jason 	 Developer 	 Technology 	 $5,500
Sanjay 	 Sysadmin 	 Technology 	 $7,000
Nisha 	 Manager 	 Marketing 	 $9,500
Randy 	 DBA 	 	 Technology 	 $6,000
Report Generated
--------------

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

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 是否与字符串“技术”匹配,如果是则打印该行。

$ awk '$4 ~/Technology/' employee.txt
200  Jason   Developer  Technology  $5,500
300  Sanjay  Sysadmin   Technology  $7,000
500  Randy   DBA        Technology  $6,000

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

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

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。