首先 - 抱歉有点误导性的标题,不知道如何形容这个。
基本上,我有一个关键字列表,我想获取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并使用系统调用执行它,就会出现故障,正则表达式不再起作用。
答案 0 :(得分:2)
您已在"
命令中正确转义system
,但看起来您没有在sed命令中转义\
。到达sed时,\(
被视为普通(
尝试将system
语句更改为print
,您就会明白我的意思。
最糟糕的情况是,您可以将一系列system
命令捆绑到一个shell脚本中并让awk调用它......但在这种情况下,您可能完全使用shell脚本而不是awk。 / p>