我有一个输入文件" 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的内容。
提前致谢
答案 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
消除重新处理变量值的任何问题。