2014-04-29 230 views
0

我有一個輸入文件「myfile」和殼變量「VAR」,其 內容如下所示:可變模式匹配AWK

# cat myfile 
Hello World 
Hello Universe 
# echo $VAR 
World 

我需要處理所有的行中的「文件MyFile」,其中包含模式「世界「 使用awk。它適用,如果我這樣做如下所示:

# awk '/World/ { print $0 }' myfile 

但我不能使用VAR來做同樣的操作。我試過 以下甚至不知道這些是行不通的:

# awk '/$VAR/ { print $0 }' myfile 

# awk -v lvar=$VAR '/lvar/ { print $0 }' myfile 

# awk -v lvar=$VAR 'lvar { print $0 }' myfile 

請讓我知道如何VAR的內容匹配的AWK。

在此先感謝

回答

1

你可以使用:

awk -v lvar="$VAR" '$0~lvar {print}' myfile 

或(的作品,但不推薦):

awk "/$VAR/ {print}" myfile 
+0

建議不要在'awk'中使用變量,所以我會使用第二個。或者像這樣'awk'$ 0〜lvar {print}'lvar =「$ VAR」myfile' – Jotne

1

這可能是你想要什麼:

awk -v lvar="$VAR" '$0~lvar' myfile 

千萬不要做

awk "/$VAR/" myfile 

,或者內嵌擴展awk腳本中的shell變量,使得他們成爲,因爲它可以產生各種奇怪的故障和錯誤信息取決於shell變量是如何因爲與填充的腳本的一部分的任何其他語法該語法在awk中沒有變量,但shell變量內容被集成到腳本中,就好像您對它進行了硬編碼一樣。

始終做到以上使用-v

取決於你的外殼擴展反斜槓要求。詳情請參閱http://cfajohnson.com/shell/cus-faq-2.html#Q24

只有做到

awk '$0~lvar' lvar="$VAR" myfile 

,如果你正在處理多個文件,需要更改文件之間的變量的初始值,並沒有對GAWK或BEGINFILE需要從環境變量中填充這些值。

請注意,如果您需要字符串匹配而不是使用awk -v lvar="$VAR" 'index($0,lvar)',上述所有操作都會在lvar上執行正則表達式匹配。