如何匹配awk中变量中给出的模式?

时间:2016-09-08 06:47:59

标签: regex bash shell awk substring

我想从管道分离文件中提取某个模式存在的子字符串,因此我使用了下面的命令

awk -F ":" '/REWARD REQ. SERVER HEADERS/{print $1, $2, $3, $4}' sample_profile.txt

在这里,'REWARD REQ。 “SERVER HEADERS”是一个要在文件中搜索的模式,并在冒号分隔的行上打印其前4个部分。

现在,我想发送bash变量作为模式。因此我使用了以下命令,但它不起作用。

awk -v pat="$pattern" -F ":" '/pat/{print $1, $2 , $3, $4 } sample_profile.txt

如何在单个-v命令中使用-Fawk

3 个答案:

答案 0 :(得分:28)

此处的问题与-F没有关系。

当您希望/pat/成为变量时,问题是使用pat。如果您说/pat/awk将其理解为文字" pat",那么它会尝试匹配包含字符串" pat"。

如果您想通过变量提供模式,则需要使用~

 awk -v pat="$pattern" '$0 ~ 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

  

'〜'或'!〜'运算符的右侧不一定是正则表达式   常量(即斜杠之间的字符串)。它可能是任何   表达。表达式将被计算并转换为字符串if   必要;然后将字符串的内容用作正则表达式。一个   以这种方式计算的regexp称为动态正则表达式或计算的   正则表达式:

BEGIN { digits_regexp = "[[:digit:]]+" }
$0 ~ digits_regexp    { print }
     

这将digits_regexp设置为描述一个或多个数字的正则表达式,   并测试输入记录是否与此正则表达式匹配。

答案 1 :(得分:5)

awk -v pat="$pattern" -F":" '$0 ~ pat { print $1, $2, $3, $4 }' sample_profile.txt

您无法在正则表达式//表示法中使用该变量(无法将其与搜索pat区分开来);你必须指定变量是一个带有~(匹配)运算符的正则表达式。

答案 2 :(得分:0)

这是一种破解,但它让我的事情变得更简单。

cmd="awk '/$pattern/'"
eval $cmd

首先让它成为一个字符串让你操纵它超过awk的边界