bash 获取时间段内的日志内容
需求,获取时段内的/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 获取时间段内的日志内容的更多相关文章
- Shell 从日志文件中选择时间段内的日志输出到另一个文件
Shell 从日志文件中选择时间段内的日志输出到另一个文件 情况是这样的,某系统的日志全部写在一个日志文件内,所以这个文件非常大,非常长,每次查阅的时候非常的不方便.所以,相关人员希望能够查询某个时间 ...
- 利用webBrowser获取框架内Html页面内容
原文:利用webBrowser获取框架内Html页面内容 利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说. 可是一些 HTML 文档由“框架”构成,或可以存放它们自己独特 ...
- SQL 获取时间段内日期列表
declare @start date,@end date; set @start='2010-01-01'; set @end='2010-02-01'; --获取时间段内日期列表 select [ ...
- SVN windows内修改日志内容(错误解决)
在我的电脑是windows 7,使用TortoiseSVN客户端,选中代码目录,点击右键,选择<显示日志> 显示日志信息 修改原来的日志信息(在需要修改的版本的日志中点击鼠标右键,显示如下 ...
- 根据时间段获取时间段内所有时间点(js)
Date.prototype.format=function (){var s='';s+=this.getFullYear()+'-';// 获取年份.s+=(this.getMonth()+1)+ ...
- SQL获取时间段内的所有月份
select convert(varchar(7),dateadd(month,number,'2010-01-01'),120) AS MONTHfrom master..spt_valueswhe ...
- sql获取时间段内的所有日期
,'2015-01-01 00:00:00') h INTO vinson_h DELETE vinson_h DECLARE @h int SELECT @h=DATEDIFF(HOUR,'2015 ...
- java获取时间段内的所有日期
public static void main(String[] args) { SimpleDateFormat dateFormat = new SimpleDateForm ...
- JAVA 获取时间段内的每一天
public class day { public static void main(String[] args) { // TODO Auto-generated method stub Strin ...
随机推荐
- shell脚本学习总结03--别名的使用
1.创建别名 $ alias dms='cd Oracle/Middleware/user_projects/domains/7001_costctl/' $ dms $ dms $ pwd /hom ...
- C语言while语句
在C语言中,共有三大常用的程序结构: 顺序结构:代码从前往后执行,没有任何“拐弯抹角”: 选择结构:也叫分支结构,重点要掌握 if else.switch 以及条件运算符: 循环结构:重复执行同一段代 ...
- 微软向开源又迈进了一大步:Checked C
导读 微软开源了 Checked C ,这是一个 C 语言的扩展版本,可以用于解决 C 语言中的一系列安全相关的隐患.正如其名字所示,Checked C 为 C 语言增加了检查,这个检查可以帮助开发者 ...
- Json与数组
今天趁着看源代码的同时,记录学习的小知识. 一.String.Split 方法有6个重载函数: 1) public string[] Split(params char[] separator)2) ...
- 《从零开始学Swift》学习笔记(Day 65)——Cocoa Touch设计模式及应用之选择器
原创文章,欢迎转载.转载请注明:关东升的博客 实现目标与动作关联使用UIControl类addTarget(_:action:forControlEvents:)方法,示例代码如下: button.a ...
- EditText监听方法,实时的判断输入多少字符
最近在写一个小项目,其中有一点用到了显示EditText中输入了多少个字符,像微博中显示剩余多少字符的功能.在EditText提供了一个方法addTextChangedListener实现对输入文本的 ...
- java如何遍历Enumeration
public class TestEnumeration{public static void main(String[] args){ Vector v = new Vector(); v.addE ...
- spring配置文件注解方式引入的两种方式
一.#{beanID['propertiesName']}方式 <bean id="propertyConfigurer" class="org.springfra ...
- 安装mysql最后一步未响应,卡死。(解决方法mySql5.5,以及安装教程)
安装教程:http://www.server110.com/mysql/201308/784.html 重装mysql的时候,总是在提交配置后的最后一步,安装失败,进程管理器里显示程序无响应,mysq ...
- 2017-2018-2 20165330实验二《Java面向对象程序设计》实验报告
实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 (一)单元测试 三种代码 伪代码:从意图层面来解 ...