您的位置:首页 > 运维架构 > Shell

grep命令参数列表过长?我们还有find、xargs和grep

2014-12-09 16:52 204 查看

一、问题

捞取当前目录中指定子目录下指定服务器指定时间范围内所有包含有“功勋获取”的日志内容

1、指定子目录

1.2.3.25
....
1.2.3.83

2、指定服务器

该服务器的日志的文件名格式为:
sceneserver.log.(年的后两位,两位数)(月份,不够用0补,两位数)(日,不够用0补,两位数)-(小时,不够用0补,两位数)

如2014年1月22号16点的日志文件名为:sceneserver.log.140122-16

3、指定时间范围

从2014年10月22到2014年12月9号

二、grep的无奈

毋庸置疑,直接想到的肯定是强大的grep,写出命令:
grep '功勋获取' 1.2.3.{2[5-9],[3-7][0-9],8[0-3]}/sceneserver.log.14{10{2[2-9],3},11,120[1-9]}* > tmp.log


不一会结果就出来了。提示:
提示:命令参数列表过长

(后来发现匹配的文件有接近3w个)

好了,那么问题来了:
除了grep外,还有那些linux命令是支持正则表达的搜索文件的?

三、强大的组合

找文件肯定就是find命令了,man一下,发现find其实是支持正则表达式的。命令:
find . -regextype "egrep" -regex "\./1\.2\.3\.(2[5-9]|[3-7][0-9]|8[0-3])/sceneserver\.log\.14(10(2[2-9]|3)|11|120[1-9]).*" -print0 | xargs -0 grep '功勋获取' >> tmp.log

需要注意的地方有:
1、注意find命令参数中-print和-print0的区别、以及xargs参数有-0参数和没有-0参数的区别
2、可以使用下面的命令查看匹配的文件有多少个
find . -regextype "egrep" -regex "\./1\.2\.3\.(2[5-9]|[3-7][0-9]|8[0-3])/sceneserver\.log\.14(10(2[2-9]|3)|11|120[1-9]).*" -print | wc -l
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息