2012-04-25 104 views
3

我得到这个语法错误与我的代码 - 我试过把报价放在各个地方,但没有运气。有人可以帮助吗?谢谢!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" 
+0

你可以添加代码格式和换行符超长行吗?我开始,但报价嵌套级别使它不明显什么应该是新的内容在易读性... – sarnold 2012-04-25 01:03:40

+0

是更好的?我不知道如何在这个网站上做格式化... – Jim 2012-04-25 01:06:40

+0

显着更好,我只是添加了一些调整,让代码显示为尊重换行符的等宽文本。您可以通过点击紧接着_edited_文字的“ago”前的时间来查看我所做的。 – sarnold 2012-04-25 01:07:36

回答

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" 
+0

嘿丹尼斯,我得到这个新的错误消息与你修改代码 – Jim 2012-04-25 17:21:55

+0

awk:在正则表达式中的换行符修订1 :) {)...在源代码行5 上下文是 \t if(rslt〜/ Rev 1 :) {> >> <<< awk:正则表达式中的语法错误Rev 1 :) {at { source line number 4 – Jim 2012-04-25 17:22:01

+0

@Jim:哦,'if'语句中缺少斜杠。 – 2012-04-25 18:47:53

2

awk的参数不被终止。 awk正在解释你的管道的其余部分,并感到困惑。如果您确实希望将管道作为awk脚本的一部分,请考虑将awk脚本编写为文件(删除封闭的单引号)或用双引号替换最外面的单引号,并使用\来避免中间双引号。不幸的是,你不能嵌套单引号。

1

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

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

注:嵌入\'工作,相当于用双引号呢。

$ echo 'hello\'world' 
hello\'world 
+0

你是对的,你不能使用反斜线直接在单引号字符串中嵌入单引号,但如果先终止单引号字符串并嵌入'\'',然后恢复,那么你实际上输入''''',就像'echo'hello'\''world''一样。 – 2012-04-25 01:57:48