免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 勒色
打印 上一主题 下一主题

如何截取规定时间内的文本内容 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-03-20 15:54 |只看该作者
原帖由 勒色 于 2008-3-20 15:50 发表
我偏向于分析当前实时输出的日志,脚本分析有10分钟的滞后也没有关系,历史日志分析暂时不分析

实时的就用crond 来截取 然后crond 用脚本分析
简单了

论坛徽章:
0
12 [报告]
发表于 2008-03-20 15:54 |只看该作者
原帖由 ly5066113 于 2008-3-20 15:49 发表
#!/bin/sh
startdate=$(awk -F'[]' 'NR==1{print $1*3600+$2*60+$3;exit}' urfile)
while :
do
        let enddate=$startdate+300
        awk -F'[]' -v s=$startdate -v e=$enddate '{a=$1*3600+$ ...




我先道声谢!

脚本我调试一下,马上回来!

论坛徽章:
0
13 [报告]
发表于 2008-03-20 16:05 |只看该作者
原帖由 ly5066113 于 2008-3-20 15:49 发表
#!/bin/sh
startdate=$(awk -F'[]' 'NR==1{print $1*3600+$2*60+$3;exit}' urfile)
while :
do
        let enddate=$startdate+300
        awk -F'[]' -v s=$startdate -v e=$enddate '{a=$1*3600+$ ...

光比较$1 $2 $3 获得的时间,如果24小时以后,时间循环了,就会有问题

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
14 [报告]
发表于 2008-03-20 16:20 |只看该作者
原帖由 jinl 于 2008-3-20 16:05 发表

光比较$1 $2 $3 获得的时间,如果24小时以后,时间循环了,就会有问题


估计日志文件是一天一个吧。否则没有年月日也没办法呀。

论坛徽章:
0
15 [报告]
发表于 2008-03-20 16:30 |只看该作者
原帖由 ly5066113 于 2008-3-20 16:20 发表


估计日志文件是一天一个吧。否则没有年月日也没办法呀。

年月在第三个字段里面好像有

论坛徽章:
0
16 [报告]
发表于 2008-03-20 16:41 |只看该作者
这个实际上吧不用判年月的
理论上既然是日志,则总是按日期时间排列的。

只要判断一下当前行的小时数是比上一行小,就认为是到了下一天了。

论坛徽章:
0
17 [报告]
发表于 2008-03-20 16:54 |只看该作者
由于第三列就是date -u的输出。我是把第三列数据剔出来交给date比较得到需求行,感觉这样思路简单点。
脚本如下

#!/bin/bash

now=`date +%s` #如果需要其它时间自己修改这句
while read line
do
echo $line | awk -F"[|]" '{print $3}' > temp #如果要用第一列的时间,用awk -F"[ |]" …规范就成了
i=`date -f temp +%s`
#time=`date -d "1970-01-01 $i sec utc" -u` #我的时间是utc
#echo "$time"
if [ $(($now-$i)) -lt 300 ] #5分钟=300秒
then
echo "$line" >> match.txt
fi
done < $1

剩下的就是简单分析match.txt的数据了,就简单了。
两个注释的是我测试时加的,这里没用。

[ 本帖最后由 galford433 于 2008-3-20 18:48 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2008-03-20 17:34 |只看该作者
我的脚本是分析FreeBSD下的postfix日志的,以下是截取日志的部分,仅供参考:

#!/usr/local/bin/bash
#this script must called per 5 minutes in crond or must change the $sdate and $stime
#
rm -f /tmp/.snmptmp.*
binpath="/usr/bin/"
EGREP="${binpath}egrep"
tmpfile="/tmp/.snmptmp.$$"
nowtime=$(date +%H:%M)
if [ $nowtime == '00:00' ];then                  #日志是00:00rotate
        logfile="/var/log/maillog.1"
else
        logfile="/var/log/maillog"
fi
sdate=$(date -v"-5M" "+%b %d %H:%M")            #获取5分钟前的时间(格式须与日志中的相同)
subminu1="${sdate:0:11}"
subminu="${sdate:11:1}"                          #$subminu只会是0或5
if [ $subminu == 0 ];then
        subminu2="[0-4]"
else
        subminu2="[5-9]"
fi
stime=${subminu1}${subminu2}
Timepatt="^$stime"
$EGREP "$Timepatt" ${logfile} >$tmpfile

论坛徽章:
0
19 [报告]
发表于 2008-03-20 17:35 |只看该作者
我觉得 吧所哟时间转换成 时间戳 然后去% 5分钟 不知可行不?

论坛徽章:
0
20 [报告]
发表于 2008-03-20 18:26 |只看该作者
gawk '
BEGIN{
FS="|";
total=0;
status0=0;
status1=0;
currentTime=systime();
}

{
if(($1>=strftime("%H:%M:%S",currentTime-300))&&($1<=strftime("%H:%M:%S",currentTime))){
        total=total+1;
        if($NF==0){
        status0=status0+1;
        }
        else{
                status1=status1+1;
        }
}
}

END{
        printf("total records=%d,status0=%d,status1=%d",total,status0,status1);
};
'

[ 本帖最后由 gzkaka 于 2008-3-21 11:19 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP