2014-04-29 162 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上执行正则表达式匹配。