如何在搜索中使用awk变量?

时间:2013-07-26 05:11:27

标签: shell awk

如何在搜索中使用awk变量?

Name="jony"
awk -v name="$Name" '/name/ {print $0}' file

这将搜索字符串name,而不是$Name实际上是jony

3 个答案:

答案 0 :(得分:6)

正确,awk无法识别/ /中的变量。你可以这样做:

Name="jony"
awk -v name="$Name" '$0 ~ name' file

由于printawk'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本身包含,则会发生错误!标志。这使得使用双引号不可靠。

所以,为了安全起见,更喜欢单引号:)