awk语法错误

时间:2012-04-25 01:01:59

标签: awk

我的代码出现了这个语法错误 - 我试过把引号放在各个地方,但没有运气。有人可以帮助。谢谢!

awk: non-terminated string  | grep Re... at source line 1
 context is
     >>>  <<< 
awk: giving up
 source line number 2
awk '/ (TCP|UDP) / { split($5, addr, /:/); 
cmd = "/bin/geoiplookup " addr[1] | grep 'Rev 1:' | sed 's/Rev 1: //g' " | awk -F', ' '{print $4",", $3",", $2}'; 
cmd | getline rslt; 
close(cmd); 
print $1, $2, $3, $4, $5, $6, rslt }' < "$IP_PARSED" >> "$BlockedIPs"

3 个答案:

答案 0 :(得分:2)

awk的参数未终止。 awk正在解释你的其他管道并感到困惑。如果您确实打算将管道作为awk脚本的一部分,请考虑将awk脚本作为文件(删除封闭的单引号)或用双引号替换最外面的单引号并使用{{1}避免介入双引号。不幸的是,你不能嵌套单引号。

答案 1 :(得分:1)

您正试图在单引号中嵌入单引号。这不起作用;而且,shell无法轻松嵌入它们。有一些复杂的方法,例如

$ echo 'hello'"'"'world'
hello'world
$ echo 'hello'\''world'
hello'world

注意:嵌入\'使工作,与双引号相同。

$ echo 'hello\'world'
hello\'world

答案 2 :(得分:1)

我想我们以前来过这里。不要试图在cmd内进行复杂的处理。使用它来运行外部命令,然后在主AWK程序中进行处理。

awk '/ (TCP|UDP) / { split($5, addr, /:/); 
cmd = "/bin/geoiplookup " addr[1] ; 
while (cmd | getline rslt) {
    if (rslt ~ /Rev 1: /) {
        gsub(/Rev 1: /, "", rslt)
        split(rslt, r, ",")
    }
}
close(cmd); 
print $1, $2, $3, $4, $5, $6, r[4], r[3], r[2] }' < "$IP_PARSED" >> "$BlockedIPs"