我正在学习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字段的开始,因为它应该是一个前缀和全部;-)
我该如何做?
你可以试试这个
- BEGIN{
- 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更多。 (从头到尾阅读!)