AWK - 其他函数
AWK具有以下杂项功能 −
close(expr)
此函数关闭管道文件
示例
[jerry]$ awk 'BEGIN { cmd = "tr [a-z] [A-Z]" print "hello, world !!!" |& cmd close(cmd, "to") cmd |& getline out print out; close(cmd); }'
在执行此代码时,您会得到以下结果 −
输出
HELLO, WORLD !!!
脚本看起来很神秘吗? 让我们揭开它的神秘面纱。
第一条语句 cmd = "tr [a-z] [A-Z]" - 是我们从 AWK 建立双向通信的命令。
下一条语句,即 print 命令,为 tr 命令提供输入。 这里&|表示双向通信。
第三条语句,即 close(cmd, "to"),在执行后关闭 to 进程。
下一条语句 cmd |& getline out 借助 getline 函数将输出存储到 out 变量中。
下一个 print 语句打印输出,最后 close 函数关闭命令。
delete
此函数从数组中删除一个元素。 下面的例子展示了 delete 函数的用法 −
示例
[jerry]$ awk 'BEGIN { arr[0] = "One" arr[1] = "Two" arr[2] = "Three" arr[3] = "Four" print "Array elements before delete operation:" for (i in arr) { print arr[i] } delete arr[0] delete arr[1] print "Array elements after delete operation:" for (i in arr) { print arr[i] } }'
在执行此代码时,您会得到以下结果 −
输出
Array elements before delete operation: One Two Three Four Array elements after delete operation: Three Four
exit
此函数停止脚本的执行。 它还接受一个可选的 expr,它成为 AWK 的返回值。 下面的例子描述了退出函数的用法。
示例
[jerry]$ awk 'BEGIN { print "Hello, World !!!" exit 10 print "AWK never executes this statement." }'
在执行此代码时,您会得到以下结果 −
输出
Hello, World !!!
fflush
此函数刷新与打开的输出文件或管道关联的任何缓冲区。 以下语法演示了该功能。
语法
fflush([output-expr])
如果没有提供 output-expr,它会刷新标准输出。 如果 output-expr 是空字符串 (""),那么它会刷新所有打开的文件和管道。
getline
此函数指示 AWK 读取下一行。 以下示例使用 getline 函数读取并显示 marks.txt 文件。
示例
[jerry]$ awk '{getline; print $0}' marks.txt
在执行此代码时,您会得到以下结果 −
输出
2) Rahul Maths 90 4) Kedar English 85 5) Hari History 89
该脚本工作正常。 但是第一行在哪里? 让我们一探究竟。
在开始时,AWK 从文件 marks.txt 中读取第一行并将其存储到 $0 变量中。
最后,AWK 的 print 语句打印第二行。 这个过程一直持续到文件结束。
next
next 函数改变程序的流程。 它会导致模式空间的当前处理停止。 程序读取下一行,并使用新行再次开始执行命令。 例如,以下程序在模式匹配成功时不执行任何处理。
示例
[jerry]$ awk '{if ($0 ~/Shyam/) next; print $0}' marks.txt
在执行此代码时,您会得到以下结果 −
输出
1) Amit Physics 80 2) Rahul Maths 90 4) Kedar English 85 5) Hari History 89
nextfile
nextfile 函数改变程序的流程。 它停止处理当前输入文件并通过模式/过程语句开始一个新的循环,从下一个文件的第一条记录开始。 例如,以下示例在模式匹配成功时停止处理第一个文件。
首先创建两个文件。 假设 file1.txt 包含 −
file1:str1 file1:str2 file1:str3 file1:str4
file2.txt 包含 −
file2:str1 file2:str2 file2:str3 file2:str4
现在让我们使用 nextfile 函数。
示例
[jerry]$ awk '{ if ($0 ~ /file1:str2/) nextfile; print $0 }' file1.txt file2.txt
输出
在执行此代码时,您会得到以下结果 −
file1:str1 file2:str1 file2:str2 file2:str3 file2:str4
return
此函数可在用户定义的函数中用于返回值。 请注意,如果未提供 expr,则函数的返回值是未定义的。 下面的例子描述了返回函数的使用。
首先,创建一个包含 AWK 命令的 functions.awk 文件,如下所示 −
示例
function addition(num1, num2) { result = num1 + num2 return result } BEGIN { res = addition(10, 20) print "10 + 20 = " res }
在执行此代码时,您会得到以下结果 −
输出
10 + 20 = 30
system
该函数执行指定的命令并返回其退出状态。 返回状态 0 表示命令执行成功。 非零值表示命令执行失败。 例如,以下示例显示当前日期并显示命令的返回状态。
示例
[jerry]$ awk 'BEGIN { ret = system("date"); print "Return value = " ret }'
在执行此代码时,您会得到以下结果 −
输出
Sun Dec 21 23:16:07 IST 2014 Return value = 0