如何在awk中插入bash变量?

如何在awk中插入bash变量?
  1. 如何在 awk 中插入 bash 变量(例如我需要在一些 for 循环中执行 - 像这样:在第一次迭代中使用 awk 按第一列搜索字符串,然后按第二列搜索字符串,依此类推与 bash 变量的模式不同在 awk 中)

或者

  1. 找到简单的制作方法完全模式(作为字符串)并将其作为参数接收给 awk。

尝试在 awk 中插入 bash 变量 -

我有一些日志 -

$ cat > log
test1
test2
ahaha
hahah

我愿意

$ cat log | awk '$1~/test1|test2/ {print }'
test1
test2

一切都好

我需要将 bash 变量粘贴到 awk 中

$ a=test1
$ b=test2

然后我尝试插入

$ cat log | awk 'BEGIN{a;b} $1~/a|b/ {print }'
ahaha
hahah

$ cat log |  awk -v a=test1 -v b=test2 '$1~/a|b/ {print }'
ahaha
hahah

如何将所有模式作为字符串并将其作为参数接收到 awk -

$ p='$1~/test1|test2/ {print }'

$ cat log | awk p
# get test1
# get test2

答案1

将模式作为变量传递给 awk 并使用动态模式显式比较(即与字符串中的模式匹配)...

awk -v pat="$a|$b" '$1 ~ pat' log

或者

awk -v a="$a" -v b="$b" '$1 ~ a "|" b ' log

注意:您不能使用静态模式 /.../ (或只能使用脏引用/转义)。

答案2

awk 不扩展内部变量/.../

$ cat log |  awk -v a=test1 -v b=test2 '$1 ~ a || $1 ~ b {print }'

$ p='$1~/test1|test2/ {print }'
$ cat log |  awk "$p"

应该可以工作(未经测试)

相关内容