如何在搜索中使用awk变量?
Name="jony"
awk -v name="$Name" '/name/ {print $0}' file
这将搜索字符串name
,而不是$Name
实际上是jony
。
答案 0 :(得分:6)
正确,awk
无法识别/ /
中的变量。你可以这样做:
Name="jony"
awk -v name="$Name" '$0 ~ name' file
由于print
是awk's
默认行为,我们可以避免在此处使用它。
答案 1 :(得分:1)
希望我能正确理解问题: 为什么不尝试下一个:
awk '/'"$Name"'/ { print } ' testfile
答案 2 :(得分:0)
编写AWK单行时,可以使用单引号或双引号引用脚本。在后一种情况下,shell直接执行所有替换,因此您无需通过-v
选项将变量传递到脚本中:
Name="jony"
awk "/$Name/" file
# this works. after shell has performed substitutions, the line looks like
awk "/jony/" file
[bad!]如果名称不包含空格,甚至没有引号:
awk /$Name/ file
只要您想在脚本中使用$,所有简单性都会消失,包括使用$ 0,$ 1等的awk特殊变量,因为您必须转义美元符号以防止shell变量扩展。
awk "/$Name/ {print \$0}"
此外,您必须转义双引号才能将文字文本添加到脚本中。看起来很笨:
awk "/$Name/ {print \"Found in: \" \$0}"
为了表达这一切,用双引号否定正则表达式将导致shell错误:
awk "!/$Name/"
#error> ... event not found ...
如果$ Name本身包含,则会发生错误!标志。这使得使用双引号不可靠。
所以,为了安全起见,更喜欢单引号:)