2012-04-25 66 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