Select-String搜索字符串性能问题
今天在一个脚本中需要用到“select-string”用来查找关键字,脚本很容易就写好了,但是在运行该脚本的时候却发现要将近20秒才能完成,执行效率太低了,仔细把脚本从头到尾看了一遍,觉得问题就是出在“select-string”身上,因为这其中要遍历的文本文件有6MB多大小。
因为在脚本中很多地方需要在前一句命令的执行结果中查找关键字,为了方便,都是直接通过管道符将结果传给了“select-string”进行搜索,这样的搜索结果也很容易进行二次加工,如下:
netstat -an |select-string "ESTABLISHED" TCP 192.168.1.12:49228 223.202.36.52:80 ESTABLISHED |
所以在对文本文件进行遍历的时候也使用的这种方法,如下:
$dt = Get-Date $infor = Get-Content d:\setup.log |select-string "failed" (New-TimeSpan $dt).totalseconds 16.0019152 |
结果脚本运行时间为16秒多。
既然这样的执行效率很低,那换另一种方法试试呢,直接多文件进行查找,如下:
$dt = Get-Date $infor = Select-String -path d:\setup.log -Pattern "failed" (New-TimeSpan $dt).totalseconds 0.3910224 |
脚本运行时间才不到0.4秒,两种方法相差了了足足40倍之多。
在第一种方法中,先是使用了“Get-Content”获取文本文件的内容,然后才使用“Select-String”进行搜索,是不是在使用“Get-Content”获取文本文件内容的时候耗时较长呢?于是又做了下面一个试验,如下:
$dt = Get-Date $infor = Get-Content d:\setup.log (New-TimeSpan $dt).totalseconds
$dt2 = Get-Date $infor2 = $infor|select-string "failed" (New-TimeSpan $dt2).totalseconds 2.5481458 15.052861 |
两条语句的执行时间一个是2秒多,另一个是15秒多,可见其耗时都远远多于直接使用“Select-String”对文件进行遍历,在以后我们应该尽量避免使用第一种方法遍历文件。