2015-10-18 151 views
0

繼續,Awk doesn't match all match all my entries,我現在正在嘗試編寫一個腳本來在不同的機器上執行此操作。在腳本中,我想運行/ usr/xpg4/bin/awk,如果它存在其他常規awk。 我不能做簡單的事情,因爲我的腳本太複雜 - 我不想做一些用戶友好的事情,它有一些選擇。 所以我記錄正確的AWK的變量是這樣的:執行命令從變量

command='awk '"'"'match($0,/^[[:alpha:]_][[:alnum:]_]*\**[[:space:]]+[[:alpha:]_][[:alnum:]_]*[[:space:]]*\([^)]*\)/) { print substr($0,RSTART,RLENGTH) ";\n" }'"'"; 

之後我嘗試執行

碼= $($命令$文件);

我得到這個錯誤:

awk: command line:1: 'match($0,/^[[:alpha:]_][[:alnum:]_]*\**[[:space:]]+[[:alpha:]_][[:alnum:]_]*[[:space:]]*\([^)]*\)/) 
awk: command line:1:^bad character « ' » in expression 

,如果我把他們趕走,這並不意味着什麼...

+1

[不要把命令放在字符串中。使用數組](http://mywiki.wooledge.org/BashFAQ/050)。 –

+1

爲什麼你把代碼放入數據?爲什麼不使用函數而不是變量?也相關:[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。 –

回答

0

粗略地說,不要那樣做。

AWK=/usr/xpg4/bin/awk 
if [ ! -x "$AWK" ] 
then AWK="awk" 
fi 

然後你可以使用:

code=$("$AWK" '…your awk script…' "$file") 

或者你可以把你的腳本到一個文件,script.awk和使用:

code=$("$AWK" -f script.awk "$file") 

我們可以辯論的雙引號的優點圍繞使用"$AWK";有優點和缺點。

如果你需要不同的awk腳本(的Solaris?)awk的不同亞種,那麼你就可以創建不同的script.awk文件,並仍然使用通用符號與-f script.awk執行腳本。

並沒有義務使用名稱script.awk;它只是說明性的。事實上,如果您實時創建它,則應確保它是唯一命名的(例如,通過將$$(當前進程ID)添加到名稱中)。謹防安全問題。我不確定Solaris是否附帶mktemp命令來安全地創建臨時文件。

+0

當然有前面的測試,但我測試腳本後就省略了。 我寧願只有一個文件,所以沒有外部的awk腳本。 –

+0

它對報價效果更好,謝謝! –