外部命令

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

results matching ""

    No results matching ""