我编写了一个 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 小时/天之内的物品
获取最后一次的时间:
endtime=`tail -1 $3 | awk '{ print substr($4, 2, length($4)-1) }'`
将其转换为纪元时间。
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`
參閱这我上面提到的主题来完成你的任务。