gpt4 book ai didi

regex - 如何匹配awk中变量中给定的模式?

转载 作者:太空宇宙 更新时间:2023-11-04 11:47:50 25 4
gpt4 key购买 nike

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

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

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

最佳答案

如果你想通过变量提供模式,你需要使用~来匹配它:

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 :

When a regexp is enclosed in slashes, such as /foo/, we call it a regexp constant, much like 5.27 is a numeric constant and "foo" is a string constant.

GNU Awk User's Guide → 3.6 Using Dynamic Regexps :

The righthand side of a ‘~’ or ‘!~’ operator need not be a regexpconstant (i.e., a string of characters between slashes). It may be anyexpression. The expression is evaluated and converted to a string ifnecessary; the contents of the string are then used as the regexp. Aregexp computed in this way is called a dynamic regexp or a computedregexp:

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

This sets digits_regexp to a regexp that describes one or more digits,and tests whether the input record matches this regexp.

关于regex - 如何匹配awk中变量中给定的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57078196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com