|
|
51CTO旗下网站
|
|
移动端

在awk中怎么使用循环

awk 脚本有三个主要部分:BEGIN 和 END 函数(都可选),用户自己写的每次要执行的函数。某种程度上,awk 的主体部分就是一个循环,因为函数中的命令对每一条记录都会执行一次。然而,有时你希望对于一条记录执行多次命令,那么你就需要用到循环。

作者:Seth Kenlon来源:Linux中国|2019-12-03 10:00

在awk中怎么使用循环

来学习一下多次执行同一条命令的不同类型的循环。

awk 脚本有三个主要部分:BEGINEND 函数(都可选),用户自己写的每次要执行的函数。某种程度上,awk 的主体部分就是一个循环,因为函数中的命令对每一条记录都会执行一次。然而,有时你希望对于一条记录执行多次命令,那么你就需要用到循环。

有多种类型的循环,分别适合不同的场景。

while 循环

一个 while 循环检测一个表达式,如果表达式为 true 就执行命令。当表达式变为 false 时,循环中断。

  1. #!/bin/awk -f
  2.  
  3. BEGIN {
  4. # Loop through 1 to 10
  5.  
  6. i=1;
  7. while (i <= 10) {
  8. print i, " to the second power is ", i*i;
  9. i = i+1;
  10. }
  11. exit;
  12. }

在这个简单实例中,awk 打印了放在变量 i 中的整数值的平方。while (i <= 10) 语句告诉 awk 仅在 i 的值小于或等于 10 时才执行循环。在循环最后一次执行时(i 的值是 10),循环终止。

do-while 循环

do-while 循环执行在关键字 do 之后的命令。在每次循环结束时检测一个测试表达式来决定是否终止循环。仅在测试表达式返回 true 时才会重复执行命令(即还没有到终止循环的条件)。如果测试表达式返回 false,因为到了终止循环的条件所以循环被终止。

  1. #!/usr/bin/awk -f
  2. BEGIN {
  3.  
  4. i=2;
  5. do {
  6. print i, " to the second power is ", i*i;
  7. i = i + 1
  8. }
  9. while (i < 10)
  10.  
  11. exit;
  12. }

for 循环

awk 中有两种 for 循环。

一种 for 循环初始化一个变量,检测一个测试表达式,执行变量递增,当表达式的结果为 true 时循环就会一直执行。

  1. #!/bin/awk -f
  2.  
  3. BEGIN {
  4. for (i=1; i <= 10; i++) {
  5. print i, " to the second power is ", i*i;
  6. }
  7. exit;
  8. }

另一种 for 循环设置一个有连续索引的数组变量,对每一个索引执行一个命令集。换句话说,它用一个数组“收集”每一条命令执行后的结果。

本例实现了一个简易版的 Unix 命令 uniq。通过把一系列字符串作为键加到数组 a 中,当相同的键再次出现时就增加键值,可以得到某个字符串出现的次数(就像 uniq--count 选项)。如果你打印该数组的所有键,将会得到出现过的所有字符串。

用演示文件 colours.txt(前一篇文章中的文件)来举例:

  1. name       color  amount
  2. apple      red    4
  3. banana     yellow 6
  4. raspberry  red    99
  5. strawberry red    3
  6. grape      purple 10
  7. apple      green  8
  8. plum       purple 2
  9. kiwi       brown  4
  10. potato     brown  9
  11. pineapple  yellow 5

这是 awk 版的简易 uniq -c

  1. #! /usr/bin/awk -f
  2.  
  3. NR != 1 {
  4.     a[$2]++
  5. }
  6. END {
  7.     for (key in a) {
  8.                 print a[key] " " key
  9.     }
  10. }

示例数据文件的第三列是第一列列出的条目的计数。你可以用一个数组和 for 循环来按颜色统计第三列的条目。

  1. #! /usr/bin/awk -f
  2.  
  3. BEGIN {
  4.     FS=" ";
  5.     OFS="\t";
  6.     print("color\tsum");
  7. }
  8. NR != 1 {
  9.     a[$2]+=$3;
  10. }
  11. END {
  12.     for (b in a) {
  13.         print b, a[b]
  14.     }
  15. }

你可以看到,在处理文件之前也需要在 BEFORE 函数(仅仅执行一次)中打印一列表头。

循环

在任何编程语言中循环都是很重要的一部分,awk 也不例外。使用循环你可以控制 awk 脚本怎样去运行,它可以统计什么信息,还有它怎么去处理你的数据。我们下一篇文章会讨论 switchcontinuenext 语句。

【编辑推荐】

  1. 了解Linux I/O 调度器,优化系统性能
  2. 如何在Fedora 30 Server上安装LEMP(Linux、Nginx、MariaDB、PHP)
  3. 相见恨晚的15个 Linux 神器,你可能一个都没见过
  4. 5个用于在Linux终端中查找域名IP地址的命令
  5. Linux删除了老古董SYSCTL系统调用
【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

骨干网与数据中心建设案例

骨干网与数据中心建设案例

高级网工必会
共20章 | 捷哥CCIE

403人订阅学习

中间件安全防护攻略

中间件安全防护攻略

4类安全防护
共4章 | hack_man

151人订阅学习

CentOS 8 全新学习术

CentOS 8 全新学习术

CentOS 8 正式发布
共16章 | UbuntuServer

291人订阅学习

读 书 +更多

系统分析师技术指南

本书对前沿而又成熟的系统分析技术和方法进行了讨论,包括CMM与过程改进、J2EE与NET平台、中间件及相关技术、应用服务器、Web 服务、数据...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微