保存为 tail_access_log 脚本取代tail命令。
分析这些日志的时候就须要小心处理了,比如:笔者的訪问日志已经有700多MB了,一次性读取的化会相当的慢。通常我们使用 tac 命令读取文件最后一部分内容,sed 命令用于结束读取。
脚本例如以下:
#!/bin/sh
# 返回近期N天内 "NCSA" 格式的 HTTP 日志
days=$1
log="$2"
export LANG=C #加速
export TZ=UTC0
last_log_date=`tail -1 "$log" |
sed ‘s#.*\[\([^:]*\):\([^ ]*\) .*#\1 \2#g‘ |
tr ‘/‘ ‘ ‘`
yesterday=`date --date="$last_log_date $days day ago" +"%d/%b/%Y:%H:%M"`
#间隔周期10分钟
yesterday=`echo $yesterday | cut -b-16`
yesterday="$yesterday[0-9]"
tac "$log" | sed "\#$yesterday#Q"
相同将脚本保存为get_last_days [天数] [文件名称]。就可以使用。
讲了这个这么多以下来段实例。一般。我们可能会感兴趣会有哪些用户订阅了我们的rss种子。已经採用何种方式订阅的。skyfeed、google等等。
#!/bin/sh
export LANG=C #加速
feed="/feed/rss2.xml"
#查看一周内订阅rss的用户的訪问情况
./get_last_days 7 access_log |
#过滤rss feed url
grep -F "GET $feed" |
#剔除通过refer訪问rss的网站
grep -vE "pixelbeat.org.*(rv:|MSIE|AppleWebKit/|Konqueror|Opera) .* " |
#获取 ip地址 & 浏览器情况
sed ‘s/\([0-9]*\.[0-9]*\)\.[0-9]*\.[0-9]* .*"\([^"]*\)"$/\1\t\2/‘ |
#依据浏览器、用户网段进行排序
sort -k2 -k1,1 |
#合并
uniq -c |
#忽略单个请求
grep -vE " 1 .*(rv:|MSIE|AppleWebKit/|Konqueror|Opera).*" |
#忽略机器人訪问
grep -vE -f agents_to_ignore |
#合并订阅用户
sed ‘
s/\([^\t]\)\t.*Firefox.*/\1\tFirefox/;
s/\([^\t]\)\t.*MSIE 7.0.*/\1\tIE7/;
s/\([^\t]\)\t.*Opera.*/\1\tOpera/;
s/\([^\t]\)\t.*Akregator.*/\1\tAkregator/;
s/\([^\t]\)\t.*Thunderbird.*/\1\tThunderbird/;
s/\([^\t]\)\t.*Liferea.*/\1\tLiferea/;
s/\([^\t]\)\t.*Google Desktop.*/\1\tGoogle Desktop/;
‘ |
#显示浏览器类型
cut -d"`echo -e ‘\t‘`" -f2 |
#分组
sort |
#计数
uniq -c |
#识别使用google订阅的用户
sed ‘s/\(.*\)\(feedfetcher.html\)\(.*\)id=\([0-9]*\).*/\1\2.\4\3/‘ |
#计数
sed ‘s/ *[0-9]* .*\(http[^;]*\).* \([0-9]*\) subscriber.*/ \2 \1/‘ |
#再次合并处理
uniq -f1 |
#排序
sort -k1,1n |
#对齐
sed "s/^/ /; s/ *\([ 0-9]\{7,\}\) \([^ ].*\)/\1 \2/" |
#截取
sed "s/\(.\{80\}\).*/\1/" #note $COLUMNS not exported
原文:http://www.cnblogs.com/lcchuguo/p/5269965.html