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 ...
随机推荐
- 探讨"点"语法的奥秘
点语法 一直以来,都不理解什么是点语法,都说是相当于链接或是路径.也许我浏览的信息量少吧,看过好几篇有关的博文,没什么记载,本篇只是初步见解分析. 在javascript里,属性和方法都使用“点”语法 ...
- Qt、MVB
使用的陪测网卡是[众志诚MVB网卡],通过串口配置,可以接收和发送MVB数据. 一.MVB通信介绍 对于某一节点[如众志诚MVB网卡],为其配置0x710和0x720端口为源端口,用于发送数据,为其配 ...
- Hive查询Join
Select a.val,b.val From a [Left|Right|Full Outer] Join b On (a.key==b.key); 现有两张表:sales 列出了人名及其所购商品的 ...
- Codeforces Round #365 (Div. 2) D - Mishka and Interesting sum(离线树状数组)
http://codeforces.com/contest/703/problem/D 题意: 给出一行数,有m次查询,每次查询输出区间内出现次数为偶数次的数字的异或和. 思路: 这儿利用一下异或和的 ...
- JAVA8 HashMap 源码阅读
序 阅读java源码可能是每一个java程序员的必修课,只有知其所以然,才能更好的使用java,写出更优美的程序,阅读java源码也为我们后面阅读java框架的源码打下了基础.阅读源代码其实就像再看一 ...
- 实用SQL语句
sp_depends t_im_flow 获取到与这个表有关系的存储过程.触发器.函数.视图等.
- OpenID 和 OAuth 的区别及第三方登录的安全隐患分析
转自:http://itindex.net/detail/48552-openid-oauth-%E6%96%B9%E7%99%BB 发表时间:2014-03-13 19:09 | 作者:天梯梦 出处 ...
- matlab C++ (VS Qt)混合编程 / mxArray / QT5中文乱码
一.混合编程环境搭建---依据我的情况,分成了4个部分: 1:破解matlab,因为matlab破解不完全,编译器不能使用,会出错.(参考https://blog.csdn.net/a12593012 ...
- C++(三十二) — 常对象、常成员变量、常成员函数
常量:对于既需要共享.又需要防止改变的数据.在程序运行期间不可改变. const 修饰的是对象中的 this 指针.所以不能被修改. 1.常对象 数据成员值在对象的整个生存期内不能改变.在定义时必须初 ...
- Python list降序排序
test = [6,1,2,3,4,5] a = sorted(test,reverse=True) print a 结果如下: [6, 5, 4, 3, 2, 1] 你可以参考下sorted,里面是 ...