2017-02-24 28 views
0

我的腳本中有以下一行awk代碼,它在日誌的開始和結束模式之間搜索文本。awk處理特殊字符,同時在兩種模式之間捕獲文本

日誌類似於:

[zzzz] Static WEB3 
[zzzz] capture me 
[zzzz] capture me 
[zzzz] capture me 
[zzzz] end-pattern 

或者可以

[zzzz] Static WEB1 :: WEB2 :: WEB3 
[zzzz] capture me 
[zzzz] capture me 
[zzzz] capture me 
[zzzz] end-pattern 

awk腳本:

awk "/\[zzzz\] Static ${VAR3}/|| /${VAR1} :: ${VAR2} :: ${VAR3} /{flag=1;next} /end-pattern:/{flag=0}flag" /tmp/error.log 

我得到了這些錯誤:

01:18:35 awk: cmd. line:1: /\[zzzz\] Static WEB3/|| /WEB1 :: WEB2 :: WEB3 /{flag=1;next}   /end-pattern:/{flag=0}flag 
01:18:35 awk: cmd. line:1:          ^syntax error 
01:18:35 awk: cmd. line:1: /\[zzzz\] Static WEB3/|| /WEB1 :: WEB2 :: WEB3 /{flag=1;next}   /end-pattern:/{flag=0}flag 
01:18:35 awk: cmd. line:1:                      ^syntax error 

我不明白爲什麼我從awk得到上面的syntax errors,而上面的代碼在我的本地機器上完全執行(ubuntu 16.04,帶有bash GNU bash,版本4.3.46(1) - 釋放)。

我也嘗試使用\之前:逃脫但我得到一個不同的問題。

01:18:35 awk: cmd. line:1: /\[zzzz\] Static WEB3/|| /WEB1 \:\: WEB2 \:\: WEB3 /{flag=1;next}   /end-pattern:/{flag=0}flag 
01:18:35 awk: cmd. line:1:           ^backslash not last character on line 
01:18:35 awk: cmd. line:1: /\[zzzz\] Static WEB3/|| /WEB1 \:\: WEB2 \:\: WEB3 /{flag=1;next}   /end-pattern:/{flag=0}flag 
01:18:35 awk: cmd. line:1:                       ^syntax error 

我在這裏錯過了什麼?

+0

如果直接使用值而不是變量,腳本是否可以工作? – Sundeep

+1

你能給一個你正在試試這個文件的樣本內容嗎? – Inian

+0

試試這個 - awk「/ \ [zzzz \] \ Static \ $ {VAR3}/||/$ {VAR1} :: $ {VAR2} :: $ {VAR3}/{flag = 1; next}/end -pattern:/ {flag = 0} flag「 –

回答

1

不要在整個任何腳本(無論是awk還是sed或其他任何東西)中使用雙引號,因爲它們會讓shell變量展開成爲腳本主體的一部分,從而導致模糊錯誤和隱蔽錯誤消息(如果你幸運的話)。

做你想要使用awk你設置AWK變量的shell變量的值,然後使用腳本中的awk變量:

awk -v var1="$VAR1" -v var2="$VAR2" -v var3="$VAR3" ' 
    $0 ~ ("\[zzzz\] Static " var3 " ") || $0 ~ (var1 " :: " var2 " :: " var3 " ") {flag=1;next} 
    /end-pattern:/{flag=0}flag 
' /tmp/error.log 

我沒有檢查,如果腳本是有道理或不,只是修正了使用awk變量的語法,而不是嘗試使用shell變量。

+0

有沒有辦法處理-v var1 =」$ VAR1「-v var2 =」$ VAR2「有時是空的,以避免腳本失敗? – askb

+0

是的,當然,它是軟件,所以有辦法做任何事情。一旦你找到你在這裏提出的問題的解決方案,接受它,然後發佈一個簡明,可測試的樣本輸入和預期輸出的後續問題,展示你正試圖解決的新問題。 –