如何使用 awk 调用外部程序

linuxoperating systemopen source

简介

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"的文件。