首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将变量传递给awk并在正则表达式中使用该变量

将变量传递给awk并在正则表达式中使用该变量
EN

Stack Overflow用户
提问于 2010-02-09 16:02:39
回答 4查看 24.7K关注 0票数 20

我正在学习awk,并且在将变量传递给脚本并将其用作regex搜索模式的一部分时遇到了问题。

这个例子是人为设计的,但却显示了我的问题。

我的数据如下:

代码语言:javascript
复制
Eddy        Smith       0600000000  1981-07-16    Los Angeles
Frank       Smith       0611111111  1947-04-29    Chicago           
Victoria    McSmith     0687654321  1982-12-16    Los Angeles
Barbara     Smithy      0633244321  1984-06-24    Boston            
Jane        McSmithy    0612345678  1947-01-15    Chicago               
Grace       Jones       0622222222  1985-10-07    Los Angeles
Bernard     Jones       0647658763  1988-01-01    New York          
George      Jonesy      0623428948  1983-01-01    New York          
Indiana     McJones     0698732298  1952-01-01    Miami             
Philip      McJonesy    0644238523  1954-01-01    Miami

我想要一个awk脚本,我可以传递一个变量,然后让awk脚本为该变量执行正则表达式。我现在有一个名为"003_search_persons.awk“的脚本。

代码语言:javascript
复制
#this awk script looks for a certain name, returns firstName, lastName and City

#print column headers
BEGIN {
    printf "firstName lastName City\n";
}

#look for the name, print firstName, lastName and City
$2 ~ name {
    printf $1 " " $2 " " $5 " " $6;
    printf "\n";
}

我这样调用脚本:

代码语言:javascript
复制
awk -f 003_search_persons.awk name=Smith 003_persons.txt

它返回以下内容,这很好。

代码语言:javascript
复制
firstName lastName City
Eddy Smith Los Angeles
Frank Smith Chicago
Victoria McSmith Los Angeles
Barbara Smithy Boston
Jane McSmithy Chicago

但是现在我想找一个特定的前缀"Mc“。当然,我可以对此进行硬编码,但我需要一个灵活的awk脚本。我用003_search_persons_prefix.awk写了以下内容。

代码语言:javascript
复制
#this awk script looks for a certain prefix to a name, returns firstName, lastName and City

#print column headers
BEGIN {
    printf "firstName lastName City\n";
}

#look for the prefix, print firstName, lastName and City
/^prefix/{
    printf $1 " " $2 " " $5 " " $6;
    printf "\n";
}

我这样调用脚本:

代码语言:javascript
复制
awk -f 003_search_persons_prefix.awk prefix=Mc 003_persons.txt

但现在它找不到任何记录。

问题在于搜索模式"/^prefix/“。我知道我可以用一个非正则表达式替换这个搜索模式,就像在第一个脚本中一样,但是假设我想用一个正则表达式来做这件事,因为我需要前缀真正位于lastName字段的开头,就像它应该是一个前缀一样;-)

我该怎么做呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-09 16:21:50

你可以试试这个

代码语言:javascript
复制
BEGIN{
 printf "firstName lastName City\n";
 split(ARGV[1], n,"=")
 prefix=n[2]
 pat="^"prefix
}
$0 ~ pat{
    print "found: "$0
}

输出

代码语言:javascript
复制
$ awk -f  test.awk name=Jane file
firstName lastName City
found: Jane        McSmithy    0612345678  1947-01-15    Chicago

有关更多信息,请查看awk documentation。(从头到尾读一遍!)

票数 17
EN

Stack Overflow用户

发布于 2012-11-14 02:17:42

将脚本更改为:

代码语言:javascript
复制
BEGIN {
    print "firstName", "lastName", "City"
    ORS = "\n\n"
}

$0 ~ "^" prefix {
    print $1, $2, $5, $6
}

并将其称为

代码语言:javascript
复制
awk -v prefix="Mc" -f 003_search_persons.awk 003_persons.txt
票数 5
EN

Stack Overflow用户

发布于 2010-02-09 16:37:28

你应该能够原封不动地使用你的原始脚本- $2 ~ name已经在做一个正则表达式搜索,所以如果你用name=^Mc调用你的脚本,那么它将返回以"Mc“开头的名称。实际上,这不是一个很好的例子,因为Mc只出现在名称的开头-如果你使用name=^Smith,那么它将找到McSmiths而不是Smith。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2227583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档