需求,获取时段内的/var/log/messages文件内出现错误的消息,支持多行的消息,支持天,小时分钟,秒级的区间,可以修改监控的日志对象
#!/bin/bash

if [ $# != 1 ] ; then
echo "USAGE: $0 num[Y|D|H|M|S]"
echo " e.g.: $0 12h"
exit 1;
fi interval=$1
unit=$(echo $interval | tr -d [:blank:] |tr -d [:digit:] |tr -t [a-z] [A-Z])
val=$(echo $interval | tr -d [:blank:] |tr -d [:alpha:] )
#echo $val
#echo $unit case $unit in
Y) unit="years"
;;
D)
unit="days"
;;
H)
unit="hours"
;;
M)
unit="minutes"
;;
S)
unit="seconds"
;;
*)
echo "not"
exit 1;
;;
esac
#echo $unit ts=$(date -d"-${val}${unit}" +"%s")
echo $ts
#date span one year 计算两年之间的秒数
cts=$(date +"%s")
x1=$(date -d"$(date +%Y)-01-01 00:00:00" +"%s")
x2=$(date -d"$(date -d'-1years' +%Y)-01-01 00:00:00" +"%s")
((secs=$x1-$x2)) checkfile=/var/log/messages
#checkfile=/home/student/test.txt #first_line=$(awk -v ts="$ts" '{"date -d \""$1" "$2" "$3"\" +%s 2>/dev/null"|getline dt; if(dt>ts) {print $0; exit;}}' $checkfile)
first_line=$(awk -v secs="$secs" -v ts="$ts" -v cts="$cts" '{"date -d \""$1" "$2" "$3"\" +%s 2>/dev/null"|getline dt;if(dt>cts){dt=dt-secs;}if(dt>ts) {print $0; exit;}}' $checkfile) echo "firstline is $first_line" if [ "$first_line"X == "X" ]; then exit 1; fi basedir=$(cd `dirname $0`;pwd)
#echo "basedir is $basedir" log=$basedir/linux_messages.log
>$log #function to handle one msg
handleOneMsg()
{
msg="$1"
has_error=$(echo "$msg"|grep -oie "\berror\b")
if [ "$has_error"X != "X" ]; then
#first we should encode the < > &
msg_out=$(echo "$msg" |sed 's/&/&/g'| sed 's/</\</g'|sed 's/>/\>/g' )
cat <<EOF >>$log
<msg>
<hostName>`hostname`</hostName>
<product>LINUX</product>
<date>`date +"%Y-%m-%d %T"`</date>
<streamName>messages</streamName>
<output>$msg_out</output>
</msg>
EOF
fi } OLDIFS=IFS
IFS=$'\n'
for line in $(grep -A100000 -F "$first_line" $checkfile)
do
#date ..... one message is start with date
#before another msg is the last msg's body
line_begin=$(echo $line | awk '{print $1,$2,$3}')
#echo "line begin is $line_begin" line_begin_ts=$(date -d "$line_begin" "+%s" 2>/dev/null)
#echo "line begin ts is $line_begin_ts" if [ "${line_begin_ts}"X == "X" -o "$msg"X == "X" ] ; then
msg="${msg}"$'\n'"${line}"
continue;#consume next line
fi handleOneMsg "$msg"
msg=$line
done handleOneMsg "$msg" IFS=$OLDIFS

bash 获取时间段内的日志内容的更多相关文章

  1. Shell 从日志文件中选择时间段内的日志输出到另一个文件

    Shell 从日志文件中选择时间段内的日志输出到另一个文件 情况是这样的,某系统的日志全部写在一个日志文件内,所以这个文件非常大,非常长,每次查阅的时候非常的不方便.所以,相关人员希望能够查询某个时间 ...

  2. 利用webBrowser获取框架内Html页面内容

    原文:利用webBrowser获取框架内Html页面内容 利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说. 可是一些 HTML 文档由“框架”构成,或可以存放它们自己独特 ...

  3. SQL 获取时间段内日期列表

    declare @start date,@end date; set @start='2010-01-01'; set @end='2010-02-01'; --获取时间段内日期列表 select [ ...

  4. SVN windows内修改日志内容(错误解决)

    在我的电脑是windows 7,使用TortoiseSVN客户端,选中代码目录,点击右键,选择<显示日志> 显示日志信息 修改原来的日志信息(在需要修改的版本的日志中点击鼠标右键,显示如下 ...

  5. 根据时间段获取时间段内所有时间点(js)

    Date.prototype.format=function (){var s='';s+=this.getFullYear()+'-';// 获取年份.s+=(this.getMonth()+1)+ ...

  6. SQL获取时间段内的所有月份

    select convert(varchar(7),dateadd(month,number,'2010-01-01'),120) AS MONTHfrom master..spt_valueswhe ...

  7. sql获取时间段内的所有日期

    ,'2015-01-01 00:00:00') h INTO vinson_h DELETE vinson_h DECLARE @h int SELECT @h=DATEDIFF(HOUR,'2015 ...

  8. java获取时间段内的所有日期

        public static void main(String[] args) {        SimpleDateFormat dateFormat = new SimpleDateForm ...

  9. JAVA 获取时间段内的每一天

    public class day { public static void main(String[] args) { // TODO Auto-generated method stub Strin ...

随机推荐

  1. C++之运行时类型识别RTTI

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  2. 深入理解JS之Scope链

    JS被很多人认为是『拙劣的语言』,被这门语言里的各种离奇的事情整的团团转,这篇文章主要来讲讲JS中的Scope链,其主要是影响JS中的变量作用域. 注:本文适合稍有一定JS基础的同学 目录: 初步认识 ...

  3. Laravel5.1 搭建博客 --上传文件及文件管理

    教程源自:Laravel学院 这一节 咱来说说上传文件的功能实现,我们会把上传的文件保存到项目本地,不仅上传 还有删除和预览功能. 1 配置 我们先从配置开始做起,先修改我们自己创建的 blog.ph ...

  4. JAVA增删改查XML文件

    最近总是需要进行xml的相关操作. 不免的要进行xml的读取修改等,于是上网搜索,加上自己的小改动,整合了下xml的常用操作. 读取XML配置文件 首先我们需要通过DocumentBuilderFac ...

  5. hdu 1198 Farm Irrigation(深搜dfs || 并查集)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...

  6. Spring_day04--课程安排_回顾SSH框架知识点_SSH框架整合思想

    Spring_day04 上节内容回顾 今天内容介绍 回顾SSH框架知识点 Hibernate框架 Struts2框架 Spring框架 SSH框架整合思想 整合struts2和spring框架 Sp ...

  7. 编程之美 set 10 队列中取最大值操作问题

    题目 假设有这样一个拥有三个操作的队列 1. Enqueue(v) 2. Dequeue() 3. MaxEle() 请设计一种数据结构和算法, 让 MAXELE 操作的时间复杂度尽可能的低 思路 1 ...

  8. sql列转行查询

    test表: 执行列转行sql: select student, sum(case Course when '语文' then Score else null end) 语文, sum(case Co ...

  9. docker的本地仓库换成阿里云的镜像仓库

    1,阿里云上注册账号,我的已经注册好了,仓库名称:registry.cn-hangzhou.aliyuncs.com/woccb2/chen 2,本地安装docker: yum -y install ...

  10. spring的@Transactional注解详细用法(转载)

    概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型, ...