如何将 shell 变量传递给 awk 搜索模式?

如何将 shell 变量传递给 awk 搜索模式?

在我的 bash 脚本中,我有一个变量,我试图将其传递给模式以使用 awk 进行搜索。然而我期望发生的事情并没有发生。我有以下文本文件(text.txt):

-----------
Task:           a
 (some info)
  ....
------------
Task:           b 
 (some info)
  ....
------------
Task:           c
 (some info)
  ....
------------

我的脚本有以下内容:

letter=a
awk -v var="$letter" '/Task .* \var/' RS='-+' text.txt

然而,当我这样做时,除了执行以下操作之外,我什么也得不到:

awk '/Task .* a/' RS='-+' text.txt

我得到了我所期望的:

Task:           a
 (some info)
  ....

笔记:我需要将它作为变量传递,因为我有一个不断更改变量的循环,这就是我想要寻找的。我宁愿使用 awk,因为这是我最熟悉的,但我不反对听到其他建议,例如 sed 或 grep。

答案1

您可以将整个模式传递给 awk

letter=a
awk -v pattern="Task .* $letter" -v RS='-+' '
    $0 ~ pattern
' text.txt

或在 awk 中将模式构造为字符串

letter=a
awk -v ltr="$letter" -v RS='-+' '
    BEGIN {pattern = "Task .* " ltr}
    $0 ~ pattern
' text.txt

由于 awk 变量没有前缀$,因此您不能将它们嵌入到 a 中/regex constant/- 它只是其中的文本。

(我倾向于将所有 awk 变量放在前面-v

答案2

您最好的选择可能是通过环境传递变量:

letter=a
p="Task: *$letter" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file

或者:

p="Task: *a" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file

使用-v var=value,awk将扩展转义序列的值。如果你想awk从 shell 中按原样传递数据,-v var="$shell_var"这是不可靠的。

使用ENVIRON(或ARGV) 更可靠,因为 whenawk不会扩展其中的转义序列。

相关内容