免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 790 | 回复: 4

[日期时间] 怎么提取nginx日志的前5分钟数据 [复制链接]

论坛徽章:
0
发表于 2016-10-19 02:25 |显示全部楼层
access.log格式如下:
10.158.231.77 - - [18/Oct/2016:23:41:59 +0800] "GET /stat/trans/logger.js?v=d16ec0e3.js HTTP/1.0" 200 0 "/askforcooperation" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)" " 118.178.15.72"




请教如何提取前5分钟的数据,按照网上的一些说明写了个脚本,但是根本无法做出判断

#!/bin/bash
FileTime=`head -1 $Logfile |awk -F"[[ / :]" '{print "["$5"/"$6"/"$7}'`
start_time=${FileTime}:`date -d "5 mins ago" +%H:%M`
maketime=${FileTime}:`date +%H:%M`

awk -v start_time=$start_time -v maketime=$maketime  '{if ($4>start_time && $4<maketime) print $0 }' ${Logfile} >/home/temp.log  ----这个句的判断是无法生效的 $4里面带有[的原因吗?FileTime的输出感觉就是怪怪的

有大神有更好的判断语句吗?年月日都匹配还得判断前5分钟到now,求指点!

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2016-10-26 16:19:04
发表于 2016-10-19 07:42 |显示全部楼层
$4>"'$start_time'" && $4<"'maketime'"

论坛徽章:
0
发表于 2016-10-19 14:20 |显示全部楼层
回复 2# fh21_xuejinlian
如果只是这样还不行 因为前面的赋值中把oct也加入了 抓取的时候吧oct排除只留2016xxx这样就对了 谢谢 很厉害 单引号和双引号的结合 在AWK的{}特别难用!


论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
发表于 2016-10-19 16:39 |显示全部楼层
回复 1# aronl

  1. #! /bin/sh

  2. CP=/bin/cp
  3. SED=/bin/sed
  4. FIND_BIN=/usr/bin/find
  5. XARGS_BIN=/usr/bin/xargs
  6. MKDIR=/bin/mkdir
  7. SUDO_PREFIX=/usr/bin/sudo
  8. ECHO=/bin/echo
  9. AWK=/usr/bin/awk
  10. EXPR=/usr/bin/expr
  11. DATE=/bin/date

  12. DEF_TIMEAGO=300
  13. DEF_BASESEC=`${DATE} +'%s'`

  14. basesec=$DEF_BASESEC
  15. timeago=$DEF_TIMEAGO

  16. Usage()
  17. {
  18.         _ec=$1
  19.         _fmt=$2
  20.         _fp=/proc/$/fd/2

  21.         if [ $_ec -eq 0 ]
  22.                 then
  23.                 _fp=/proc/$/fd/1
  24.         fi

  25.         if [ -n "$_fmt" ]
  26.         then
  27.                 ${ECHO} "$_fmt" >$_fp
  28.         fi

  29.         ${ECHO} "$0 [OPTIONS] files..." >$_fp
  30.         ${ECHO} "  -h|--help              to display this help information" >$_fp
  31.         ${ECHO} "  -t|--time <timestr>    to specify time it must be format(31-Jan-2016 15:59:50) default(now)" >$_fp
  32.         ${ECHO} "  -a|--ago  <second>     to specify time ago default($DEF_TIMEAGO)" >$_fp
  33.         ${ECHO} "  files...               from current directory" >$_fp

  34.         exit $_ec
  35. }

  36. while [ $# -gt 0 ]
  37. do
  38.         breakone=0
  39.         case "$1" in
  40.                 -h|--help)
  41.                         Usage 0 ""
  42.                         ;;
  43.                 -t|--time)
  44.                         if [ $# -gt 1 ]
  45.                         then
  46.                                 basesec=`${DATE} --date="$2" +'%s'`       
  47.                                 shift
  48.                         else
  49.                                 Usage 3 "$1 need arg"
  50.                         fi
  51.                         ;;
  52.                 -a|--ago)
  53.                         if [ $# -gt 1 ]
  54.                         then
  55.                                 timeago="$2"
  56.                                 shift
  57.                         else
  58.                                 Usage 3 "$1 need arg"
  59.                         fi
  60.                         ;;
  61.                 *)
  62.                         breakone=1
  63.                         ;;                       
  64.         esac
  65.         if [ $breakone -gt 0 ]
  66.                 then
  67.                 break
  68.         fi
  69.         shift
  70. done


  71. while [ $# -gt 0 ]
  72. do
  73.         fileread="$1"
  74.         shift
  75.         while read -r line || [ -n "$line" ] ; do
  76.                 _date=`${ECHO} -n "$line" | ${AWK} '{print $4}' | ${SED} 's/:/ /' | ${SED} 's/\//-/g' | ${SED} 's/\[//g'`
  77.                 if [ -n "$_date" ]
  78.                 then
  79.                         _lasttime=`${DATE} --date="$_date" +'%s' 2>/dev/null`
  80.                         if [ -n "$_lasttime" ]
  81.                         then
  82.                                 _mosttime=`${EXPR} $_lasttime + $timeago`
  83.                                 if [ "$_lasttime" -le "$basesec" ] && [ "$_mosttime" -ge "$basesec" ]
  84.                                 then
  85.                                         ${ECHO} "$line"
  86.                                 fi
  87.                         fi
  88.                 fi
  89.         done < "$fileread"
  90. done
复制代码
这里只要调用
  1. ./readdate.sh access.log
复制代码
就可以了。已经实现你说的功能了。


论坛徽章:
0
发表于 2016-10-19 17:13 |显示全部楼层
本帖最后由 aronl 于 2016-10-19 17:23 编辑

回复 4# jeppeter
谢谢大神,我研究一下先!
我是这样解决的:#!/bin/bash
Logfile=/tmp/log/nginx/access.log
start_time=`date -d "5 mins ago" +%Y:%H:%M:%S`
maketime=`date +%Y:%H:%M:%S`
awk -F'[/ ]' '{if ($6>"'$start_time'" && $6<"'$maketime'" print $0}' ${Logfile} >/home/log/temp.log




但是这样的问题就存在了 如果不做nginx的日志切割的话 那么你会抓到一堆过往的数据,因为它只判断2016:%H:%M:%S,没有day没有month!

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

ITPUB技术栈

ITPUB技术栈是ITPUB企业打造的垂直于IT领域的知识社群平台,在这里,你既可以是创作者也可以是消费者。如果你的IT生涯丰富多彩,喷薄的个人价值尽可在小栈内体现;如果你渴望找到志同道合的伙伴,拓宽人脉,小栈比跑会场更快。 小栈特色:
1.极高的用户转化率,实现更直接的知识变现;
2.随时随地,刷个朋友圈的时间,实现更长效的信息沉淀;
3.戳痛、难点的专业咨询,更接近成功解决方案的时刻;
4.贴近意见领袖,个人高速成长,迈入更富有价值的人际圈。

----------------------------------------

技术小栈>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP