awk脚本vs shell命令 - 结果不同?

时间:2018-02-05 22:29:34

标签: macos shell awk

首先 - 抱歉有点误导性的标题,不知道如何形容这个。

基本上,我有一个关键字列表,我想获取google每个查询返回的文档数量。我创建了以下awk脚本:

{
    x = ""
    for(i=1;i<=NF;i++) {
        if(i==NF) {
            x = x $i
        } else {
            x = x $i "+"
        }
    }
    tab = "777" # id of an existing chrome tab as reported by 'chrome-cli list tabs'
    system("chrome-cli open http://www.google.com/search?hl=en\\&q="x" -t " tab)
    system("chrome-cli source -t " tab " | grep '<div id=\"resultStats\">About .* results<nobr>' | head -1 | sed -e 's/.*>About \(.*\) results<nobr>.*/\1/' | awk '{print $1\"\t"x"\"}' >> freq.log " );
    system("cat freq.log" );
    system("sleep 0.5");
}

这里发生的是我首先用+符号替换所有空格,执行chrome-cli命令在该特定窗口打开chrome,下载源代码并解析“About”和“results”字符串之间的数字并附加结果到freq.log。但是,这会将以下字符串输出到文件中(对于术语警报):

"})();</script><div alarm" 

当我从iOS终端执行相同的命令时,我得到一个正确的数字(返回127.000.000):

chrome-cli source -t 777 | grep  '<div id="resultStats">About .* results<nobr>' | head -1 | sed -e 's/.*>About \(.*\) results<nobr>.*/\1/'

所以我的问题基本上是,虽然一切都可以从终端正常工作,但只要我将代码移动到awk并使用系统调用执行它,就会出现故障,正则表达式不再起作用。

1 个答案:

答案 0 :(得分:2)

您已在"命令中正确转义system,但看起来您没有在sed命令中转义\。到达sed时,\(被视为普通( 尝试将system语句更改为print,您就会明白我的意思。

最糟糕的情况是,您可以将一系列system命令捆绑到一个shell脚本中并让awk调用它......但在这种情况下,您可能完全使用shell脚本而不是awk。 / p>