外部命令
不管使用任何程序,都躲不开与外部系统或是程序的交互,本小节就专门介绍一下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脚本进行组织连接,几乎就可以完成任何高级程序可以实现的功能。