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

+0

それは良いですか?私はこのサイトでどのように書式設定を行うのか分かりません... – Jim

+0

重要なことに、改行を尊重してモノスペースのテキストとして表示するコードを得るために少しだけ微調整を追加しました。 _edited_テキストのすぐ隣にある「前」の時間をクリックすると、私が何をしたのかを見ることができます。 – sarnold

答えて

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

+0

awk:正規表現の改行改行1:{)...ソース行5 コンテキストは \t if(rslt〜/ Rev 1 :) { >> <<< awk:正規表現の構文エラーRev 1 :) { ソース行番号4 – Jim

+0

@Jim:ああ、 'if'ステートメントにスラッシュがありません。 –

2

awkへの引数は終了していません。 awkはパイプラインの残りの部分を解釈して混乱しています。実際にパイプラインをawkスクリプトの一部にする場合は、awkスクリプトをファイルとして書き込むか(一重引用符を取り除く)、一番外側の一重引用符を二重引用符で置き換えて、\を使用して介入する二重引用符をエスケープしてください。残念ながら、一重引用符をネストすることはできません。

1

一重引用符を一重引用符で囲んで表示しようとしています。これは動作しません;さらに、シェルは簡単に埋め込むことができません。例

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

注のためのいくつかの複雑な方法があります:同等の二重引用符でないとして\'を埋め込むことは、ない作業を行います。

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

あなたは一重引用符を一重引用符で囲んだ文字列に直接埋め込むためにバックスラッシュクォートを使うことはできませんが、一重引用符で囲まれた文字列を最初に終了した後に再開すると '\ ' 'echo 'hello' \ '' world''のように実際に' '\' ''とタイプしてください。 –