外部命令
不管使用任何程序,都躲不开与外部系统或是程序的交互,本小节就专门介绍一下awk这方面的功能。
执行命令调用
system(cmd-line)
cmd-line 要在系统中执行的命令行字符串 返回执行命令的退出状态
如果不需要获取命令的输出而只是需要执行命令可以使用system()
函数,参考例程:
chapter_5_2-1.awk
BEGIN{ } { fold = "/tmp/test/cmd"; # 调用系统命令mkdir创建文件夹 res = system("mkdir " fold); print("res: " res); if ( 0 == res ) { print("文件夹创建成功"); } # 再次创建同样的文件夹 res = system("mkdir " fold); print("res: " res); if ( 0 != res ) { print("文件夹创建失败"); } } END{ }
$echo ""|awk -f chapter_5_2-1.awk
res: 0
文件夹创建成功
mkdir: cannot create directory `/tmp/test/cmd': File exists
res: 1
文件夹创建失败
其中mkdir: cannot create directory...
是标准错误输出,通过system()
的返回值即可判断命令执行的成功失败状态。
执行命令并获得返回
command | getline [var]
command 待执行命令字符串
var 可选参数,用于存储命令执行后的标准输出,缺省情况下结果输出到$0
使用该方式就可以调用外部程序并获取其输出,参考例程:
chapter_5_2-2.awk
BEGIN{ } { # 苹果公司最新股价的url url = "http://hq.sinajs.cn/list=gb_aapl"; # 使用curl命令来获取 # 因为源数据是gb2312编码,再使用iconv做一次编码转换 cmd = "curl -s " url "|iconv -f gb2312 -t utf-8"; # 通过管道执行命令,并将结果保存到result cmd | getline result; # 关闭命令管道 close(cmd); # 输出结果 print(result); } END{ }
$echo ""|awk -f chapter_5_2-2.awk
var hq_str_gb_aapl="苹果,124.48,-0.54,2015-07-25 08:14:40,-0.68,125.32,125.74,123.90,134.54,93.28,42100862,53015025,730055283200,8.05,15.45,0.00,1.13,1.93,1.50,5864840000,61.00,124.53,0.04,0.05,Jul 24 07:59PM EDT,Jul 24 04:01PM EDT,125.16,552240.00";
可以看到,通过对curl
程序的调用,awk实现了原本不具备的网络功能,只要善用各种外部程序和系统命令,再以awk脚本进行组织连接,几乎就可以完成任何高级程序可以实现的功能。