我正在学习awk,我无法将变量传递给脚本,并将其用作正则表达式搜索模式的一部分。
这个例子是有创意的,但显示了我的概念。
我的数据如下:
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”。
#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"; }
我打电话给这样的脚本:
awk -f 003_search_persons.awk name=Smith 003_persons.txt
它返回以下,这是好的。
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中写了以下内容。
#this awk script looks for a certain prefix to a name,lastName and City #print column headers BEGIN { printf "firstName lastName City\n"; } #look for the prefix,lastName and City /^prefix/{ printf $1 " " $2 " " $5 " " $6; printf "\n"; }
我打电话给这样的脚本:
awk -f 003_search_persons_prefix.awk prefix=Mc 003_persons.txt
但现在没有发现任何记录。
问题是搜索模式“/ ^前缀/”。我知道我可以用非正则表达式替换那个搜索模式,如第一个脚本,但是假设我想用正则表达式来做,因为我需要前缀真的是在lastName字段的开始,因为它应该是一个前缀和全部;-)
我该如何做?
你可以试试这个
原文链接:https://www.f2er.com/regex/357366.htmlBEGIN{ printf "firstName lastName City\n"; split(ARGV[1],n,"=") prefix=n[2] pat="^"prefix } $0 ~ pat{ print "found: "$0 }
产量
$ awk -f test.awk name=Jane file firstName lastName City found: Jane McSmithy 0612345678 1947-01-15 Chicago
看看awk documentation更多。 (从头到尾阅读!)