如果你想通过一个变量来提供模式,你需要使用~来匹配它:
awk -v pat="$pattern" '$0 ~ pat'
在您的情况下,问题与-F 无关。
当您希望 pat 成为变量时,问题是使用 /pat/。如果你说/pat/,awk 将其理解为文字“pat”,因此它会尝试匹配包含字符串“pat”的那些行。
总的来说,你的代码应该是:
awk -v pat="$pattern" -F ":" '$0~pat{print $1, $2, $3, $4 }' file
# ^^^^^^
看一个例子:
鉴于此文件:
$ cat file
hello
this is a var
hello bye
让我们查找包含“hello”的行:
$ awk '/hello/' file
hello
hello bye
现在让我们尝试以您的方式查找包含在变量中的“pat”:
$ awk -v pat="hello" '/pat/' file
$ # NO MATCHES!
现在让我们使用$0 ~ pat 表达式:
$ awk -v pat="hello" '$0~pat' file
hello # WE MATCH!
hello bye
当然,你可以使用这样的表达式来匹配一个字段,比如awk -v pat="$pattern" '$2 ~ pat' file等等。
来自GNU Awk User's Guide → 3.1 How to Use Regular Expressions:
当正则表达式用斜杠括起来时,例如 /foo/,我们称它为正则表达式常量,就像 5.27 是数字常量而“foo”是字符串常量一样。
还有GNU Awk User's Guide → 3.6 Using Dynamic Regexps:
“~”或“!~”运算符的右侧不必是正则表达式
常量(即斜线之间的字符串)。它可能是任何
表达。表达式被评估并转换为字符串,如果
必要的;然后将字符串的内容用作正则表达式。一种
以这种方式计算的正则表达式称为动态正则表达式或计算
正则表达式:
BEGIN { digits_regexp = "[[:digit:]]+" }
$0 ~ digits_regexp { print }
这会将 digits_regexp 设置为描述一个或多个数字的正则表达式,
并测试输入记录是否与此正则表达式匹配。