首页 > 代码库 > grep命令参数列表过长?我们还有find、xargs和grep
grep命令参数列表过长?我们还有find、xargs和grep
一、问题
捞取当前目录中指定子目录下指定服务器指定时间范围内所有包含有“功勋获取”的日志内容
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
grep命令参数列表过长?我们还有find、xargs和grep
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。