从日志文件中提取信息

从日志文件中提取信息

我编写了一个 bash 脚本来提取一些项目,例如进行最多连接尝试的 IP 地址,现在我想将所有这些限制在一定时间范围内,比如说过去 5 天/小时。

我写的示例:

-G:哪个 IP 地址的连接尝试次数最多?

if [ "$3" = "-G" ]; then 
 I won't write the whole code ! 
echo "IP address makes the most number of connection attempts: \n"
awk '{print $1}' $4 | sort | uniq -c | sort -r -n | awk '{print $2 "\t" $1}' >> Connections 
cat Connections | head -$2 
 rm Connections

现在我想添加这个项目

-O:限制为过去几小时

-P:限制为最近几天

我这样运行它:sh -O -P -G *.log

示例日志文件:

213.46.27.204 - - [15/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [16/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [17/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [18/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [19/Sep/2011:22:55:21 +0100]

请仅使用 bash 脚本回答,而不是 python 或 perl


我们有日志文件中的最后日期,我们想要提取最后 5 小时/天,因此:

我发现这个脚本将日期转换为 unix 可识别的格式,但由于我有 Mac OSX,所以我无法运行它 :( 知道为什么吗?)

#!/bin/env bash

  temp_date=`cat ./serverlog.log | tail -n1 \
  | cut -d [ -f 2 | cut -d ] -f 1`

  echo "$temp_date"

  temp_date2=`echo $temp_date | \
  sed -e 's/Jan/01/g' \
  -e 's/Feb/02/g' -e 's/Mar/03/g' \
  -e 's/Apr/04/g' -e 's/May/05/g' \
  -e 's/Jun/06/g' -e 's/Jul/07/g' \
  -e 's/Aug/08/g' -e 's/Sep/09/g' \
  -e 's/Oct/10/g' -e 's/Nov/11/g' \
  -e 's/Dec/12/g'`

  echo "$temp_date2"

  temp_year=`echo $temp_date2 | gawk '{print substr($0,7,4)}'`
  temp_month=`echo $temp_date2 | gawk '{print substr($0,4,2)}'`
  temp_day=`echo $temp_date2 | gawk '{print substr($0,1,2)}'`
  temp_time=`echo $temp_date2 | gawk '{print substr($0,12,8)}'`

  #UTC format
  utc_date="$temp_year-$temp_month-$temp_day $temp_time"

  echo "$utc_date"

  reference_seconds=`date --utc -d "$utc_date" +%s`

  echo "$reference_seconds"

我意识到最后一步是从最后一个日期中减去 5 小时/天

lastdate(转换后)-(5*3600)= X,现在我们可以从日志文件中提取过去 5 小时的数据。last date -(5*24*3600)+ X,现在我们可以从日志文件中提取过去 5 天的数据。

现在知道该如何准确书写了吗?

答案1

有一个脚本这里这将输出特定日期范围内的行。将输出通过管道传输到您的程序即可。

答案2

这不是我想要的,我想要过去 X 小时/天之内的物品

  1. 获取最后一次的时间:

    endtime=`tail -1 $3 | awk '{ print substr($4, 2, length($4)-1) }'`
    
  2. 将其转换为纪元时间。

  3. starttime计算方法是从以下数据中减去您想要过滤的最近几小时(几天)endtime

    if [ $1 = "-O" ]; then 
        time=`expr $2 \* 60 \* 60`
    fi
    if [ $1 = "-P" ]; then 
        time=`expr $2 \*24 \* 60 \* 60`
    fi
    
    starttime=`expr endtime.epoch - time`
    

參閱我上面提到的主题来完成你的任务。

相关内容