如何使用 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 命令的输出捕获到输出变量中。最后,我们使用 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 命令的输出捕获到输出变量中。
错误处理
使用 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 命令的输出捕获到输出变量中。然后,我们使用 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 调用外部程序的功能,我们可以自动执行各种任务,并使我们的脚本更加强大和灵活。
相关文章
有用资源
linux 参考教程 - 该教程包含有关 linux 的更多信息:https://www.cainiaomax.com/linux/

