awk字符串匹配与传参

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.模式匹配

有名为00的文件,里面的具体内容如下:

123	abc,100196,an
123	abc,100196,an
113	abc,100196,an
133	abc,100196,an

想要对第二个字段做模式匹配,匹配里面是否有100196这个字符串。
最开始博主用了如下方式:

#!/bin/bash
app=$1
awk -F "\t" '$2~/app/ {a[$1]++} END{print length(a)}' app=$app 00

执行该脚本,传入参数:

./test.sh 100196

发现并不能得到想要的结果!最后经过很长时间的尝试,将上面的代码改为如下:

#!/bin/bash
app=$1
awk -F "\t" '$2~app {a[$1]++} END{print length(a)}' app=$app 00

即可得到预期的结果!在这部分代码中,~就是表示用来匹配后面的正则表达式,告诉awk后面开始是正则语法。

2.用match方法

当然,也可以使用match方法,达到上面同样的效果:

awk -F "\t" '{if(match($2, app)>0) a[$1]++} END{print length(a)}' app=$app 00

3.两种传参方式的不同

上面的代码采用了传参的方式。在awk中,有两种传参方式,分别如下:

➜  shell
#!/bin/bash

app=$1

awk -F "\t" 'BEGIN{print app} {print match($2, app)}' app=$app 00
awk -F "\t" -v app=$app 'BEGIN{print app} {print match($2, app)}' 00

两种方式的区别是什么呢?看看代码运行的结果:


5
5
5
5
100196
5
5
5
5

两者的区别在于:用-v的方式传参,参数在BEGIN模块中就起了作用,而在另外一种传参方式中,参数在BEGIN模块中并没有起作用!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值