如何使用 awk 调用外部程序


简介

Awk 是一种强大的文本处理工具,可用于自动化各种任务,例如数据操作、过滤和报告。Awk 的一个有趣功能是它能够在脚本中调用外部程序。在本文中,我们将探讨如何使用 awk 调用外部程序。

了解 system() 函数

system() 函数用于在 awk 内部执行外部命令。system() 函数的语法如下:

system(command)

command 参数是要执行的外部命令。当执行 system() 函数时,awk 将 command 参数传递给 shell 以执行。然后 shell 执行命令并将退出状态返回给 awk。

调用外部程序

要使用 awk 调用外部程序,我们需要将要执行的命令指定为 system() 函数的参数。例如,假设我们想在 awk 脚本中执行 date 命令。我们可以按如下方式执行:

{ 
   system("date") 
}

在此示例中,我们使用 system() 函数调用 date 命令。当执行脚本时,将执行 date 命令,并在屏幕上显示当前日期和时间。

将输入传递给外部程序

我们可以使用 system() 函数将输入传递给外部程序。例如,假设我们想使用 sort 命令对数字列表进行排序。我们可以按如下方式执行:

{ 
   print "3
1
2" | "sort" }

在此示例中,我们使用 print 语句生成一个数字列表(3、1、2)。然后我们使用管道符号(|)将此数字列表作为输入传递给 sort 命令。然后 sort 命令对数字进行排序并将结果返回给 awk。

存储外部程序的输出

我们可以使用 getline() 函数将外部程序的输出存储在变量中。getline() 函数用于从文件或命令读取一行输入。我们可以使用 getline() 函数捕获外部程序的输出。例如,假设我们想将 ls 命令的输出捕获到一个变量中。我们可以按如下方式执行:

{ 
   "ls" | getline output 
   print output 
}

在此示例中,我们使用 system() 函数执行 ls 命令。然后我们使用 getline() 函数将 ls 命令的输出捕获到 output 变量中。最后,我们使用 print 语句显示 ls 命令的输出。

将参数传递给外部程序

我们可以使用 system() 函数将参数传递给外部程序。例如,假设我们想使用 tr 命令将字符串转换为大写。我们可以按如下方式执行:

{ 
   str = "hello world" 
   cmd = "echo " str " | tr '[:lower:]' '[:upper:]'" 
   cmd | getline output 
   print output 
}

在此示例中,我们使用 echo 命令将字符串“hello world”作为输入传递给 tr 命令。然后我们使用 tr 命令将字符串转换为大写。最后,我们使用 getline() 函数将 tr 命令的输出捕获到 output 变量中。

处理错误

使用 awk 调用外部程序时,务必处理执行过程中可能发生的错误。我们可以使用 system() 函数检查外部程序的退出状态。退出状态是一个数字,指示命令的成功或失败。值为零表示成功,非零值表示失败。

例如,假设我们想使用 test 命令检查文件是否存在。我们可以按如下方式执行:

{ 
   file = "myfile.txt" 
   cmd = "test -e " file 
   if (system(cmd) != 0) { 
      print "File does not exist" 
   } else { 
      print "File exists" 
   } 
}

在此示例中,我们使用 test 命令检查文件“myfile.txt”是否存在。然后我们使用 system() 函数执行 test 命令。如果 test 命令的退出状态为非零,则打印“文件不存在”。否则,打印“文件存在”。

高级示例

  • 过滤外部程序的输出我们可以使用 awk 过滤外部程序的输出。例如,假设我们想仅显示 ps 命令输出的第一行。我们可以按如下方式执行:

{ 
   cmd = "ps" 
   cmd | getline output 
   close(cmd) 
   split(output, lines, "
") print lines[1] }

在此示例中,我们使用 getline() 函数将 ps 命令的输出捕获到 output 变量中。然后我们使用 split() 函数将输出拆分为一个行数组。最后,我们使用 print 语句显示输出的第一行。

  • 在外部命令中使用 awk 变量我们可以将 awk 变量用于外部命令。例如,假设我们想使用 touch 命令创建一个名称基于变量的文件。我们可以按如下方式执行:

{ 
   filename = "myfile.txt" 
   cmd = "touch " filename 
   system(cmd) 
}

在此示例中,我们在 touch 命令中使用 filename 变量来创建一个名为“myfile.txt”的文件。

  • 使用 awk 格式化外部程序的输出我们可以使用 awk 格式化外部程序的输出。例如,假设我们想以更易读的格式显示 df 命令的输出。我们可以按如下方式执行:

{ 
   cmd = "df -h" 
   cmd | getline output 
   close(cmd) 
   printf "%-20s%-10s%-10s%-10s%-10s%s
", "Filesystem", "Size", "Used", "Avail", "Use%", "Mounted on" split(output, lines, "
") for (i=2; i<=length(lines); i++) { printf "%-20s%-10s%-10s%-10s%-10s%s
", $1, $2, $3, $4, $5, $6 } }

在此示例中,我们使用 printf 语句格式化 df 命令的输出。我们打印一个带有列标题的标题行,然后打印 df 命令的输出,其中每列都对齐到固定宽度。

结论

在本文中,我们探讨了如何使用 awk 调用外部程序。我们了解了如何将输入传递给外部程序、捕获外部程序的输出以及处理执行过程中可能发生的错误。通过使用 awk 调用外部程序的功能,我们可以自动化各种任务,使我们的脚本更强大、更灵活。

更新于:2023-03-24

624 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告