4

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

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

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

4

3 回答 3

6

正确,awk不会识别/ /. 你可以做:

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

由于printawk's默认行为,我们可以避免在此处使用它。

于 2013-07-26T05:18:16.953 回答
1

在编写 AWK 单行代码时,您可以使用单引号或双引号来引用脚本。在后一种情况下,shell 直接执行所有替换,因此您无需通过-v选项将变量传递到脚本中:

Name="jony"
awk "/$Name/" file
# this works. after shell has performed substitutions, the line looks like
awk "/jony/" file

[糟糕!] 如果名称不包含空格,甚至没有引号:

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 本身包含 ! 符号。这使得使用双引号不可靠。

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

于 2013-07-26T17:33:29.370 回答
1

希望我正确理解了问题:您为什么不尝试以下问题:

awk '/'"$Name"'/ { print } ' testfile 
于 2013-07-26T06:54:39.900 回答