awk和sed字符串处理速度比较与处理速度的测试方法

坚持不是胜利,坚持住才是胜利。

问题:比如现在有一需求,提取某个配置文件里面的ip地址,能立刻想到的就是根据字符串的规律合理的利用awk和sed来操作。

应用场景:做一套软件时,某个配置文件需要批量填写或更改已经填写好了的默认IP地址等信息(尽管在填写时IP地址可以简单的从某些文件或变量中获得,例如在Linux(CentOS6)等平台中可以借助source network congfig文件的方式)。

示例:配置文件中有这么一段,“<porttest host="192.168.0.142" application="video/portTest" timeout="10000" />”,如何取得IP地址呢?

字符串特征,该行中有两组数字,或5段数字,IP地址被“””括起来,可直接用awk截取第二段获取IP地址。

方法1,使用sed:

sed -n '/porttest /{s/.*host="//;s/".*//;p}' ./testfile

方法1分析:假设只有第一次匹配只匹配到一行,否则可以用head -n或tail -n来截断行,当然sed也有类似的功能。此处sed中采用了多个字命令,首先查找porttest的行,再将“host=””前的字符串换成空,再把“””后面的字符串换成空,再打印出来。

方法2,使用awk:

grep porttest ./testfile | awk -F '"' '{print $2'}

方法2分析,同字符串特征一样,IP地址被“””括起来,可直接用awk截取第二段获取IP地址。

处理速度测试:

time sed -n '/porttest /{s/.*host="//;s/".*//;p}' ./test
time grep porttest ./test | awk -F '"' '{print $2'}

测试结果:

image

sed的速度略微大于awk的速度,原因分析,可能由于awk处理的行中增加了grep和管道操作的原因。

本着测试的单一变量原则,处理一个相同的操作来比较一下。

time grep porttest ./test | sed -n 's/.*host="//;s/".*//;p'
time grep porttest ./test | awk -F '"' '{print $2'}

image 

在多次测试的情况下,两者基本相似,可以说是相差并不大。

因此在实际中哪种方便就使用哪种,哪种熟练就使用哪种。

补充:sed使用正则表达式较多,擅长行处理,awk擅长列处理,更多用法可以参考《awk and sed》一书。

end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值