如何使用 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 调用外部程序的功能,我们可以自动化各种任务,使我们的脚本更强大、更灵活。