Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件
前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容。
但是用这个脚本的同事很郁闷,因为执行时间比较长,越大的文件越长。于是找我,问我能不能实现一个更快的方案。
我想了一下,觉得之前的设计是脱裤子放屁,明明有更加简单的实现方法。
想办法获得我要截取的内容的开始的行号,然后再想办法获得我想截取的文件的结尾的行号,然后用两个行号来进行截断文件并输出。就可以实现这个效果了。
不过想法归想法,实现我还得实验一下,很快解决了问题,如下:
实现代码
#!/bin/bash
# 设定变量
log=3.log
s='2017-08-01T01:3'
e='2017-08-01T01:4'
# 根据条件获得开始和结束的行号
sl=`cat -n $log | grep $s | head -1 | sed 's/^[ \t]*//g' | cut -f1`
el=`cat -n $log | grep $e | tail -1 | sed 's/^[ \t]*//g' | cut -f1`
# 获取结果并输出到 res.log 文件
sed -n "$sl","$el"'p' $log >> res.log
运行了一下,速度飞起啊!
以上脚本均在 mac 下测试通过,在 Linux 下可能会有稍许不同。
本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。