如何在搜索中使用 awk 变量?
Name="jony"
awk -v name="$Name" '/name/ {print $0}' file
这将搜索字符串name
,而不是$Name
实际上是jony
。
正确,awk
不会识别/ /
. 你可以做:
Name="jony"
awk -v name="$Name" '$0 ~ name' file
由于print
是awk's
默认行为,我们可以避免在此处使用它。
在编写 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 本身包含 ! 符号。这使得使用双引号不可靠。
所以,为了安全起见,更喜欢单引号:)
希望我正确理解了问题:您为什么不尝试以下问题:
awk '/'"$Name"'/ { print } ' testfile