【环境】
os:win2k en server
dos窗口:cmd.exe
for命令:系统自带
findstr命令:系统自带
gnu_sed命令:v4.14
super_sed命令:v3.62 (based on gnu_sed v4.1)
【附件】
fi20.bat:for/f命令批处理
fi21.bat:findstr命令批处理
fi22.bat:sed命令批处理
fi23.bat:ssed命令批处理
批处理均使用cadv作为参数执行,即:fi20.bat cadv
cadvfi25.log:批处理调用的数据文件
cadvfi21.csv:批处理调用的数据文件
cadvfi25_t.log:内容与cadvfi25.log基本一致,仅“\”改为“\\”,供findstr,sed调用。
cadvfi23.csv:批处理进行文本匹配生成的数据文件。
cadvfi23.csv_for:与各比较命令批处理相对应的结果数据文件,供检验正确性用。
cadvfi23.csv_findstr:与各比较命令批处理相对应的结果数据文件,供检验正确性用。
cadvfi23.csv_sed:与各比较命令批处理相对应的结果数据文件,供检验正确性用。
cadvfi23.csv_ssed:与各比较命令批处理相对应的结果数据文件,供检验正确性用。
【目的】
比较for命令,findstr命令,与sed命令对文本内容进行匹配的速度,从而择优选用与学习。
【测试方式】
对于相同的内容分别测试上述三个命令进行文本匹配的速度三次,取平均值。
使用for命令的测试批处理: | | | | | :BEGIN | | ::File notes... | | @echo off | | cls&echo. | | Title [For command in the match operation] | | echo [For command in the match operation] | | :INIT | | echo [批处理执行初始化(Batch Initializing...)] | | echo. | | set t=%time% | | :MATCH | | set /p =[匹配压缩文件与解压文件信息的对应关系并输出 ... <nul | | echo md51,fullpath_filename,path,fullname1,fullname2,md52,name2,ext2,size2,ts2,tu,tc,>%1fi23.csv | | setlocal enabledelayedexpansion | | for /f "skip=2 tokens=2,4 delims= " %%l in (%1fi25.log) do ( | | set v1=%%l | | for /f "skip=1 tokens=1-11 delims=," %%a in (%1fi21.csv) do ( | | if /i %%l==%%b ( | | set aa=%%a | | set bb=%%b | | set cc=%%c | | set dd=%%d | | | | | | | | | | ) | | ) | | echo !aa!,!bb!,!cc!,!dd!,>>%1fi23.csv | | set aa= | | set bb= | | set cc= | | set dd= | | ) | | endlocal | | set /p =Done!]<nul | | echo. | | echo. | | echo Command start: %t% | | echo Command end: %time% | | echo. | | echo. | | :END | | pause::[Press Any Key to Exit...]&echo.COPY |
使用findstr命令的测试批处理: | | | | | :BEGIN | | ::File notes... | | @echo off | | cls&echo. | | Title [Findstr command in the match operation] | | echo [Findstr command in the match operation] | | echo. | | :INIT | | echo [批处理执行初始化(Batch Initializing...)] | | echo. | | set t=%time% | | :MATCH | | set /p =[匹配压缩文件与解压文件信息的对应关系并输出 ... <nul | | echo md51,fullpath_filename,path,fullname1,fullname2,md52,name2,ext2,size2,ts2,tu,tc,>%1fi23.csv | | setlocal enabledelayedexpansion | | for /f "skip=2 tokens=2,4 delims= " %%l in (%1fi25_t.log) do ( | | set v1=%%l | | for /f "usebackq tokens=1-11 delims=," %%a in (`findstr /i "%%l" %1fi21.csv`) do ( | | set aa=%%a | | set bb=%%b | | set cc=%%c | | set dd=%%d | | | | | | | | | | ) | | echo !aa!,!bb!,!cc!,!dd!,>>%1fi23.csv | | set aa= | | set bb= | | set cc= | | set dd= | | ) | | endlocal | | set /p =Done!]<nul | | echo. | | echo. | | echo Command start: %t% | | echo Command end: %time% | | echo. | | echo. | | :END | | pause::[Press Any Key to Exit...]&echo.COPY |
使用sed命令的测试批处理: | | | | | :BEGIN | | ::File notes... | | @echo off | | cls&echo. | | Title [GNU_sed v4.14 command in the match operation] | | echo [GNU_sed v4.14 command in the match operation] | | echo. | | :INIT | | echo [批处理执行初始化(Batch Initializing...)] | | echo. | | set t=%time% | | :MATCH | | set /p =[匹配压缩文件与解压文件信息的对应关系并输出 ... <nul | | echo md51,fullpath_filename,path,fullname1,fullname2,md52,name2,ext2,size2,ts2,tu,tc,>%1fi23.csv | | setlocal enabledelayedexpansion | | for /f "skip=2 tokens=2,4 delims= " %%l in (%1fi25_t.log) do ( | | set v1=%%l | | for /f "usebackq tokens=1-11 delims=," %%a in (`sed -n "/%%l,/Ip" %1fi21.csv`) do ( | | set aa=%%a | | set bb=%%b | | set cc=%%c | | set dd=%%d | | | | | | | | | | ) | | echo !aa!,!bb!,!cc!,!dd!,>>%1fi23.csv | | set aa= | | set bb= | | set cc= | | set dd= | | ) | | endlocal | | set /p =Done!]<nul | | echo. | | echo. | | echo Command start: %t% | | echo Command end: %time% | | echo. | | echo. | | :END | | pause::[Press Any Key to Exit...]&echo.COPY |
【结果】
在我的机器上面的测试的结果是:findstr(2.95s)》gnu_sed(8.08s)》for /f(8.21s),结果对功能超强的gnu_sed来说,不免会让人失去学习的动力。但是如果对使用sed的批处理稍作修改,使用super_sed v3.62(ssed.exe),结果是惊人的ssed(1.19s)。
可见在一般的情况下面,使用findstr是比较方便的,不仅因为它快,还因为它是随系统自带的。
但sed也值得我们去仔细学习一下,功能太多了,但是为了速度,也许我们要对它的版本作个选择。
[ 本帖最后由 nh_wzg 于 2008-10-11 17:53 编辑 ] |