grep awk匹配字符串性能对比
近期遇到个场景,需要在某个较大的文本中匹配特定的一批字符串,并将其滤除或者打印出来。
使用了shell的grep
和awk
,对于这两个工具的文本处理效率和方法有了些基本的认识。
grep
最初的想法是grep
命令,即:
grep -Ff A B #打印文件A和文件B中有相同字符串的行
grep -vFf A B #打印文件B中有,但是文件A中没有的行
由于待处理的文件有百万甚至千万行,直接grep
导致将内存爆炸。测试使用的2G内存VPS直接进程killed,而使用了32G内存的物理机,在运行一段时间后,直接宕机。ミ゚Д゚彡
awk
后续使用了awk中的匹配功能,整体内存使用在1G左右,效率也高很多。
awk 'ARGIND==1 {a[$0]} ARGIND>1&&($3 in a) {print $0}' A B
#ARGIND表示当前文件序号
#将A文件的$0赋值到数组a,如果B文件某行的$3有在数组a中出现,则打印该行;
awk 'ARGIND==1 {a[$0]} ARGIND>1&&!($3 in a) {print $0}' A B
#将A文件的$0赋值到数组a,如果B文件某行的$3没有在数组a中出现,则打印该行;
如此这般,awk的文本处理效率确实很高,使用方法十分灵活。好好学习这个吧~