2010-12-23 41 views
8

我剛纔想這從我的shell腳本和結果使用bash變量並未如預期從內部AWK

REF=SEARCH_TEXT 
echo "some text" | awk '/$REF/{print $2}' 

它沒有找到$ REF即使文本包含它

推薦!

+0

[將shell腳本變量傳遞給awk命令](http://superuser.com/questions/203819/passing-a-shell-script-variable-into-an-awk-command) – ephemient 2010-12-23 15:34:48

回答

15

你問題的措辭真的差...

無論如何,我認爲你想這樣的:

REF=SEARCH_TEXT 
echo "some text" | awk "/$REF/{print \$2}" 

$2轉義和雙引號。

或本:

REF=SEARCH_TEXT 
echo "some text" | awk "/$REF/"'{print $2}' 

注意合理使用雙和單引號和$2沒有逃脫。

你必須使用外殼擴展,否則將包括出口shell變量,並使用它與awk的環境 - 這是矯枉過正在這種情況下:

export REF=SEARCH_TEXT 
echo "some text" | awk '{if (match($0, ENVIRON["REF"])) print $2}' 

我認爲awk進行不支持/.../ guard中的變量。 如果我錯了,請糾正我。

+0

$ 2在沒有\的情況下工作良好。問題是關於$ REF,awk沒有花費。 thx – vehomzzz 2010-12-23 14:10:55

+0

@Fritschy:對於很多使用互聯網的人來說,英語不是他們的第一語言,有些人使用Google來翻譯他們的問題。 ;-) – 2010-12-23 14:11:01

+0

vehomzzz,當使用雙引號時 - 這是我在roder中建議讓shell正確地擴展`$ REF`,你必須轉義`$ 2` - 最終防止shell擴展它。 – 2010-12-23 14:12:29

36

,而不是在shell引用遊戲,使用-v選項shell變量傳遞作爲一個awk變量:

awk -v ref="$REF" 'match($0, ref) {print $2}' 

如果$REF是文本,而不是一個正則表達式,使用index()函數,而不是match()

1

gawk中,您有ENVIRON數組,例如, awk 'END{print ENVIRON["REF"]}' /dev/null將打印您的變量,如果您已將export從外殼編輯到子過程。