- 如何在 awk 中插入 bash 变量(例如我需要在一些 for 循环中执行 - 像这样:在第一次迭代中使用 awk 按第一列搜索字符串,然后按第二列搜索字符串,依此类推与 bash 变量的模式不同在 awk 中)
或者
- 找到简单的制作方法完全模式(作为字符串)并将其作为参数接收给 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"
应该可以工作(未经测试)