如果awk cmd中的模式是bash变量并包含特殊字符,我该怎么办?

dee*_*sky 1 linux bash awk

描述: 1行awk cmd用于在我的shell脚本中匹配行之后打印所有行,如下所示.

#!/bin/bash
...
awk "f;/${PATTERN}/{f=1}" ${FILE}
Run Code Online (Sandbox Code Playgroud)

由于$ {PATTERN}可能包含特殊字符,因此在这种情况下cmd将失败.

Q1.如果在awk中使用正则表达式,我应该如何处理这种情况?

Q2.是否可以只使用此cmd中的原始字符串而不是正则表达式/ $ PATTERN / 以避免特殊字符问题?

gho*_*oti 8

关.将shell变量传递给awk -v比将它们直接放入awk脚本更好.

awk -v pat="${PATTERN}" 'f; $0 ~ pat {f=1}' "${FILE}"
Run Code Online (Sandbox Code Playgroud)

如果${PATTERN}不是正则表达式,您可以使用不同的运算符:

awk -v pat="${PATTERN}" 'f; $0 == pat {f=1}' "${FILE}"
Run Code Online (Sandbox Code Playgroud)

或者您甚至可以处理非正则表达式子串:

awk -v pat="${PATTERN}" 'f; index($0, pat) {f=1}' "${FILE}"
Run Code Online (Sandbox Code Playgroud)