Shell 从日志文件中选择时间段内的日志输出到另一个文件
Shell 从日志文件中选择时间段内的日志输出到另一个文件
情况是这样的,某系统的日志全部写在一个日志文件内,所以这个文件非常大,非常长,每次查阅的时候非常的不方便。所以,相关人员希望能够查询某个时间段内的日志。我简单些了一个脚本来实现了这个效果。
不过我的实现不是最佳方案,性能上还有很大的优化空间,但我目前水平有限,没有想到更好的方法。
分析日志
5074400:2017-08-01T01:34:22.724252+00:00 test_rest_1.test_default bpmn_test: [2017/08/01 09:34:22,723] trump.restapi preprocess: 8bc570ee765911e799070242ac120006 - GET profile:{}:None
日志内容如上,每一行的格式都差不多。里面有两个时间的参数,我决定取后面的这个时间的参数。想一下,应该很容易取到。
然后拿这个时间和我们设定的开始时间和结束时间进行比较,如果在时间段之内,则把这一行字符串插入到一个新的文件。
逻辑清晰,开始实现。
实现 shell 脚本
# 设定开始时间
s='2017/08/01 0:0:0'
# 设定结束时间
e='2017/08/01 24:0:0'
# 读取 3.log 这个原始文件,并且逐行循环
cat 3.log | while read line; do
# 每读取一行,就在终端打一个#号,以便我知道这脚本还活着 :)
# -n 是让 echo 的内容在前面追加,而不是换行
# 在 mac 下面,用 sh log.sh 的方式运行会出错,不知道为什么
# 换成 bash log.sh 则可以顺利运行
echo -n "#"
# 用 cut 方式取得每一行的时间,并赋予变量
t=$(echo $line | cut -f 2 -d \[ | cut -f 1 -d \,)
# 如果 t 在我们设定的时间段内
if [[ "$t" > "$s" ]] && [[ "$t" < "$e" ]];
# 则将改行追加到 new.log 文件
then echo $line >> new.log
fi
done
好,逻辑非常清晰的实现了这个脚本。但是遇到了脚本兼容性的问题。我没搞明白为什么 sh log.sh 运行方式下 echo -n 这个参数会出问题。但是在 bash log.sh 的情况下是按照我的理解正常输出的。
问了下同事,shell 兼容性问题是一个很常见的问题。
优化这个脚本
同事给出了一个新的语法,不甚理解,但是据说效率会提升很多。代码如下:
# 设定开始时间
s='2017/08/01 0:0:0'
# 设定结束时间
e='2017/08/01 24:0:0'
# 读取每一行循环
while read line; do
# 每读取一行,就在终端打一个#号,以便我知道这脚本还活着 :)
# -n 是让 echo 的内容在前面追加,而不是换行
# 在 mac 下面,用 sh log.sh 的方式运行会出错,不知道为什么
# 换成 bash log.sh 则可以顺利运行
echo -n "#"
# 用 cut 方式取得每一行的时间,并赋予变量
t=$(echo $line | cut -f 2 -d \[ | cut -f 1 -d \,)
# 如果 t 在我们设定的时间段内
if [[ "$t" > "$s" ]] && [[ "$t" < "$e" ]];
# 则将改行追加到 new.log 文件
then echo $line >> new.log
fi
# 3.log 作为参数传进来
done < 3.log
同事解释了一下原理,没听懂,但确实可以运行,并且效率有所提高。
2017年08月03日补充
上面循环的方法是在是太浪费时间了,所以换了一个思路,实现了同样的效果。参见 Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件
以上脚本均在 mac 下测试通过,在 linux 下可能会有稍许不同。
本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。
Shell 从日志文件中选择时间段内的日志输出到另一个文件的更多相关文章
- Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件
Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...
- QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)
QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg ...
- 将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件
将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件import java.io.File;import java.io.FileOutputStre ...
- 在头文件中声明class 类 与 include类所在的头文件区别---理解
在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...
- java算法面试题:编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。
package com.swift; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...
- C#实现根据传入时间段,找出时间段内日期,并生成相对应文件路径
[1]获取固定日期范围内的所有日期,以数组形式返回 /// <summary> /// 获取固定日期范围内的所有日期,以数组形式返回 /// </summ ...
- shell脚本 在后台执行de 命令 >> 文件 2>&1 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
命令 >> 文件 2>&1或命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) # ll >>aaa 2> ...
- Java将文件中的内容转换为sql语句(和并发定时读取文件)
数据文件内容data.txt {USER_TYPE=1,CREATE_USER=ZHANG,UPDATE_USER=li,OPER_NUM=D001,SRC=2,UPDATE_TIME=2018-11 ...
- Java基础面试操作题:读取该文件内容,并按照自然顺序排序后输出到 另一个文件中
package com.swift; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...
随机推荐
- click事件多次触发 jQuery
jQuery 中 click事件会累计绑定 例如下列代码: aNode.click(function(){ bNode.click(function(){ console.log('haha'); } ...
- mybatis家族
mybatis 优秀的持久层框架,它支持定制化SQL.存储过程以及高级映射. 备注:通过mapper实现数据库与实体类相互映射 MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果 ...
- CentOS 6.2配置本地yum源
转载自http://www.cnblogs.com/centoser/articles/2411694.html#undefined 一.挂载本地光盘到系统:把Cent6.2安装光盘放入光驱,在终端命 ...
- Mac下配置Hadoop环境
下载Hadoop(我下载的是2.8.0版本) 点击此处下载 下载后,使用 tar -zxvf tar包名 解压tar包,解压完成后有这样一个文件出现 修改Hadoop的配置文件 需要修改的配置文件在H ...
- 【边框回归】边框回归(Bounding Box Regression)详解(转)
转自:打开链接 Bounding-Box regression 最近一直看检测有关的Paper, 从rcnn, fast rcnn, faster rcnn, yolo, r-fcn, ssd,到今年 ...
- 整数分解为若干项之和 - PAT
深度搜索,一开始没有想到,说明基本功还是不够啊,加油 //======================================================================= ...
- 使用百度地图LBS创建自定义标注
<body> <div id="allmap"></div> <div class="sel_container" i ...
- java 枚举的写法
1.第一种形式: public interface PrealertConstants { enum platformCodeEnum{ CAINIAO(1), CLOSED(-5), OFFLINE ...
- HtmlAgilityPach基本使用方法
//过滤html标签 static void InnerText() { HtmlWeb htmlWeb = new HtmlWeb(); HtmlDocument doc = htmlWeb.Loa ...
- 关于Spring中applicationContext.xml配置错误“org/springframework/transaction/interceptor/TransactionInterceptor”的问题解决
问题描述: 在配置spring的applicationContext.xml中的默认事务管理器的时候可能会出现这样的错误: Error occured processing XML 'org/spri ...