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 工作方法
- awk 一次读取一行输入文件。
- 对于每一行,它以给定的顺序与给定的模式匹配,如果匹配执行相应的操作。
- 如果没有模式匹配,则不会执行任何操作。
- 在上述语法中,搜索模式或操作都是可选的,但不能同时使用。
- 如果没有给出搜索模式,则 Awk 对输入的每一行执行给定的操作。
- 如果未给出操作,则打印与给定模式匹配的所有行,这是默认操作。
- 没有任何动作的空括号什么都不做,它不会执行默认的打印操作。
- 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 的值,它会为您提供技术部门的员工人数。
- 点赞
- 收藏
- 关注作者
评论(0)