84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
下午的时候有个同学问:
他们服务器有一个5G的日志文件,如何从中截取出
10.5-11.18的日志另一个文件
日志文件有规范的时期格式,类似于web服务器日志。
相关问题:
对于cat grep这类linux命令,如果操作一个大文件
会不会占用很大的内存?
人生最曼妙的风景,竟是内心的淡定与从容!
用sed好了,sed是按行处理的,不会将整个文件加载到内存中,可以放心使用要切出从2012-02-09到2012-09-10的所有数据行,(假设你的日志文件以yyyy-MM-dd的日期格式开头)只需要:
sed -n '/^2012-02-09/,/^2012-09-10/p' whole.log > part.log
无论怎么样你都必须使用某一个程序把这个文件读出来,并且用一定的规则来加以过滤。在Linux中,使用cat和grep对文件进行操作已经可以说是最经济合理的了。占用一定的系统资源是肯定的,具体的话跟你使用的cat,grep以及linux内核都有一定关系,所以可能会略有不同。一般不要在系统里出现那么大的日志文件,最好在一开始就做好日志的大小限制以及合理的日志转储和备份。
grep不会占很多内存的,不过在操作期间,这个文件会有很大一部分被OS缓存,你用free命令可以看出cached这一栏的数字显著增大,但不影响系统的可用内存数。
5g大小的文件截取很快的,偶尔过几次,对服务器压力不会很大。
不过如@xinsnake同学所说,上长期运行的服务时,就要提前做好日志切割相关的工作。
5G的文件性能上不会有什么问题,这样的文件处理上几分钟是可以接受的,也就是一些小的优化了,能用fgrep就不用grep。再不行就split切割文件,反正时间戳是递增的,每次读文件第一行和最后一行用二分确定需要的时间戳在的文件,意义也不是很大。
5G对于四路至强服务器不算什么, 几分钟的事情。 不行就split过后在提取。。 不过还是建议要提前做好日志切割, 这样子下去是不行的。
用sed好了,sed是按行处理的,不会将整个文件加载到内存中,可以放心使用
要切出从2012-02-09到2012-09-10的所有数据行,(假设你的日志文件以yyyy-MM-dd的日期格式开头)只需要:
无论怎么样你都必须使用某一个程序把这个文件读出来,并且用一定的规则来加以过滤。在Linux中,使用cat和grep对文件进行操作已经可以说是最经济合理的了。占用一定的系统资源是肯定的,具体的话跟你使用的cat,grep以及linux内核都有一定关系,所以可能会略有不同。一般不要在系统里出现那么大的日志文件,最好在一开始就做好日志的大小限制以及合理的日志转储和备份。
grep不会占很多内存的,不过在操作期间,这个文件会有很大一部分被OS缓存,你用free命令可以看出cached这一栏的数字显著增大,但不影响系统的可用内存数。
5g大小的文件截取很快的,偶尔过几次,对服务器压力不会很大。
不过如@xinsnake同学所说,上长期运行的服务时,就要提前做好日志切割相关的工作。
5G的文件性能上不会有什么问题,这样的文件处理上几分钟是可以接受的,也就是一些小的优化了,能用fgrep就不用grep。再不行就split切割文件,反正时间戳是递增的,每次读文件第一行和最后一行用二分确定需要的时间戳在的文件,意义也不是很大。
5G对于四路至强服务器不算什么, 几分钟的事情。 不行就split过后在提取。。 不过还是建议要提前做好日志切割, 这样子下去是不行的。