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 从日志文件中选择时间段内的日志输出到另一个文件的更多相关文章

  1. Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件

    Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...

  2. QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)

    QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg ...

  3. 将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件

      将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件import java.io.File;import java.io.FileOutputStre ...

  4. 在头文件中声明class 类 与 include类所在的头文件区别---理解

    在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...

  5. 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 ...

  6. C#实现根据传入时间段,找出时间段内日期,并生成相对应文件路径

    [1]获取固定日期范围内的所有日期,以数组形式返回 /// <summary>        /// 获取固定日期范围内的所有日期,以数组形式返回        /// </summ ...

  7. shell脚本 在后台执行de 命令 >> 文件 2>&1 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

    命令 >> 文件 2>&1或命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) # ll >>aaa 2> ...

  8. Java将文件中的内容转换为sql语句(和并发定时读取文件)

    数据文件内容data.txt {USER_TYPE=1,CREATE_USER=ZHANG,UPDATE_USER=li,OPER_NUM=D001,SRC=2,UPDATE_TIME=2018-11 ...

  9. Java基础面试操作题:读取该文件内容,并按照自然顺序排序后输出到 另一个文件中

    package com.swift; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...

随机推荐

  1. 非root权限 安装更新gcc

    本文主要参考网络上文章,并根据自己安装出现的问题进行补充. 参考文章: 1.gcc和boost的升级步骤(非root权限):https://blog.csdn.net/u010246947/artic ...

  2. 20145313Java第一次实验

    实验内容 1.JVM.JRE.JDK的安装位置与区别: 2.命令行运行javac:java:javac -cp; java -cp: 3.PATH,CLASSPATH,SOURCEPATH的设定方法与 ...

  3. 转:eclipse与myeclipse恢复已删除的文件和代码

  4. hbase(二)hfile结构

    HFile结构 截止hbase 1.0.2版本,hfile已经有3个版本,要深入了解hfile的话,还是要从第一个版本开始看起. hfile v1 Data Block:保存表中的数据,这部分可以被压 ...

  5. AngularJS Injector和Service的工作机制

    要了解angularJS里的injector和Service是如何工作的,需要阅读/src/auto/injector.js.另外要结合/src/loader.js才能明白它的应用场景. auto/i ...

  6. hadoop项目实战--ETL--(二)实现自动向mysql中添加数据

    四 项目开发 1 创建数据库db_etl,新建两张表user 和oder.表结构如第一部分图所示. 2 编写python脚本,实现自动向mysql中插入数据. 新建python 项目,目录结构如下图 ...

  7. 在Mac中如何正确地设置JAVA_HOME

    前期准备 下载JDK安装包:在JDK1.8下载中选择Mac的JDK安装包 安装JDK:这里只要按照安装指引一步一步安装即可 查找JAVA_HOME 打开Mac的终端,检查JDK是否安装成功:java ...

  8. gcc编译出错---make[5]: *** [s-attrtab] Killed

    内存不足导致的编译出错,解决方法是增加swapfile. root@ubuntu:home# swapon -s Filename    Type            Size    Used    ...

  9. nginx+nagios使用用户名密码鉴权设置

    1.使用htpasswd生成密码 使用apache生成/usr/local/apache2/bin/htpasswd -c ./htpasswd.users nagiosadmin 拷贝到nginx的 ...

  10. HDU 3639 Hawk-and-Chicken(强连通缩点+反向建图)

    http://acm.hdu.edu.cn/showproblem.php?pid=3639 题意: 有一群孩子正在玩老鹰抓小鸡,由于想当老鹰的人不少,孩子们通过投票的方式产生,但是投票有这么一条规则 ...