变量模式匹配awk

时间:2014-04-29 09:16:01

标签: unix awk

我有一个输入文件" myfile"和一个shell变量" VAR"谁的 内容如下所示:

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

我需要处理" myfile"中的所有行。其中包含模式" World" 使用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

请告诉我如何在awk中匹配VAR的内容。

提前致谢

3 个答案:

答案 0 :(得分:1)

您可以使用:

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

或(有效但不推荐):

awk "/$VAR/ {print}" myfile

答案 1 :(得分:1)

这可能是你想要的:

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

永远不要

awk "/$VAR/" myfile

或在awk脚本中内联扩展shell变量的任何其他语法,使得它们成为脚本的一部分,因为它可以产生各种奇怪的故障和错误消息,具体取决于shell变量的填充方式,因为使用该语法awk中没有变量,但是shell变量内容反而被集成到脚本中,就像你硬编码一样。

始终使用-v

执行上述操作
awk 'BEGIN{lvar=ARGV[1]; delete ARGV[1]} $0~lvar' "$VAR" myfile

取决于您对shell扩展反斜杠的要求。有关详细信息,请参阅http://cfajohnson.com/shell/cus-faq-2.html#Q24

只做

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

如果您正在处理多个文件,需要在文件之间更改变量的初始值,并且没有BEGINFILE的gawk或者需要从环境变量中填充这些值。

请注意,如果您需要字符串匹配而非使用lvar,则上述所有操作都会在awk -v lvar="$VAR" 'index($0,lvar)'上执行正则表达式匹配。

答案 2 :(得分:0)

如果你导出你的变量,它就会变成一个更简单的解决方案:

export VAR
awk '$0~ENVIRON["VAR"]' myfile

消除重新处理变量值的任何问题。