如何使用 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 调用外部程序的功能,我们可以自动化各种任务,使我们的脚本更强大、更灵活。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP