将变量传递给 awk 模式

Pass variable to awk pattern

我正在编写一个调用 awk 脚本的 shell 脚本,然后我使用 getline 在 BEGIN 中获取一些用户输入,并将输入保存到一些变量中。

BEGIN {printf "What's the word?"
getline word < "-"
}

现在,其中一个变量称为 "word",我想在脚本的另一个模式中使用它来打印包含给定单词的所有行。我试过这样的事情:

/(^| )word( |$)/ 

这将打印包含单词 "word" 的所有行,我知道它不会工作,因为它不被识别为变量。我搜索了很多,发现了以

开头的模式
[=12=]~

但在我的情况下它也不起作用。有没有一种方法可以将变量传递给此模式并打印包含存储在变量中的单词的所有行?

如果您使用 BEGIN 部​​分用您的完整模式构建变量,您可以稍后参考它:

awk -v word="hello" '
  BEGIN {
    pattern = "(^|[[:space:]])" word "([[:space:]]|$)"
  }

  [=10=] ~ pattern { print [=10=] }
'

...就是说,如果您不介意为每一行重建模式的开销,您甚至不需要这样做:

awk -v word="hello" '[=11=] ~ ("(^|[[:space:]])" word "([[:space:]]|$)") { print [=11=] }'

(为什么 [[:space:]] 而不是 ?这样制表符和除十六进制 20 普通空格之外的其他空白字符也可以用作单词分隔符)。

另一种选择是使用单词边界,您可以将其应用到变量中并使用一些反斜杠转义

 awk -v v="\\y$word\\y" '[=10=]~v' file

虽然不确定所有 awk 都支持这一点。或者,您可以使用 \<\> 作为左右边界。