当前位置: 技术问答>linux和unix
用grep、awk / cut 完成文本统计,请教高手!
来源: 互联网 发布时间:2016-03-25
本文导语: 有一道试题,针对一个日志文件 test.log, 内容格式形如: 203.110.136.5 - - [01/Aug/2004:00:08:40 +1000] "GET /~jc123663/MyBikeS.jpg HTTP/1.1" 304 - 66.196.90.59 - - [01/Aug/2004:00:54:45 +1000] "GET /robots.txt HTTP/1.0" 404 282 66.196.90.105 - ...
有一道试题,针对一个日志文件 test.log, 内容格式形如:
203.110.136.5 - - [01/Aug/2004:00:08:40 +1000] "GET /~jc123663/MyBikeS.jpg HTTP/1.1" 304 -
66.196.90.59 - - [01/Aug/2004:00:54:45 +1000] "GET /robots.txt HTTP/1.0" 404 282
66.196.90.105 - - [01/Aug/2004:00:54:47 +1000] "GET /~cp2010/Old/jc131568 HTTP/1.0" 301 332
.....
要求: 写一个简单的脚本a.sh, 对文件中每一行出现的日期进行统计,参数1为年,参数2为月,命令如 ./a.sh 2004 Aug ,统计文件中包含 “Aug/2004"的行的数量。
(1) 主要使用 cut 命令实现。
(2) 主要使用 grep 或awk 命令实现
因对命令不熟,请Linux大侠帮忙!
在线散分!!!多谢~
203.110.136.5 - - [01/Aug/2004:00:08:40 +1000] "GET /~jc123663/MyBikeS.jpg HTTP/1.1" 304 -
66.196.90.59 - - [01/Aug/2004:00:54:45 +1000] "GET /robots.txt HTTP/1.0" 404 282
66.196.90.105 - - [01/Aug/2004:00:54:47 +1000] "GET /~cp2010/Old/jc131568 HTTP/1.0" 301 332
.....
要求: 写一个简单的脚本a.sh, 对文件中每一行出现的日期进行统计,参数1为年,参数2为月,命令如 ./a.sh 2004 Aug ,统计文件中包含 “Aug/2004"的行的数量。
(1) 主要使用 cut 命令实现。
(2) 主要使用 grep 或awk 命令实现
因对命令不熟,请Linux大侠帮忙!
在线散分!!!多谢~
|
if [ $# -eq 0 ]
then
echo -e "usage: ./test.sh 2008 Febn./test.sh 2008"
exit -1
fi
count=0
mon[1]=0
mon[2]=0
mon[3]=0
mon[4]=0
mon[5]=0
mon[6]=0
mon[7]=0
mon[8]=0
mon[9]=0
mon[10]=0
mon[11]=0
mon[12]=0
while read line
do
month=`echo $line|cut -d'/' -f 2`
year=`echo $line|cut -d'/' -f 3 |cut -d':' -f 1`
#echo $year $month
if [ $# -eq 2 ]
then
if [ $1 = $year -a $2 = $month ]
then
count=`expr $count + 1`
fi
elif [ $# -eq 1 ]
then
if [ $1 = $year ]
then
case "$month"
in
Jan)mon[1]=`expr ${mon[1]} + 1`;;
Feb)mon[2]=`expr ${mon[2]} + 1`;;
Mar)mon[3]=`expr ${mon[3]} + 1`;;
Apr)mon[4]=`expr ${mon[4]} + 1`;;
May)mon[5]=`expr ${mon[5]} + 1`;;
Jun)mon[6]=`expr ${mon[6]} + 1`;;
Jul)mon[7]=`expr ${mon[7]} + 1`;;
Aug)mon[8]=`expr ${mon[8]} + 1`;;
Sep)mon[9]=`expr ${mon[9]} + 1`;;
Oct)mon[10]=`expr ${mon[10]} + 1`;;
Nov)mon[11]=`expr ${mon[11]} + 1`;;
Dec)mon[12]=`expr ${mon[12]} + 1`;;
esac
fi
fi
done test.html
if [ $# -eq 2 ]
then
grep -c $1.*$2 my_sample_log.txt|read mon1
echo $2 $1 $mon1
echo ''$1''$mon1'' >>test.html
elif [ $# -eq 1 ]
then
echo $1
for month in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
do
grep -c $month.*$1 my_sample_log.txt|read mon1
echo ''$1''$month''$mon1'' >>test.html
echo $month $mon1
done
fi
echo ' ' >>test.html
then
echo -e "usage: ./test.sh 2008 Febn./test.sh 2008"
exit -1
fi
count=0
mon[1]=0
mon[2]=0
mon[3]=0
mon[4]=0
mon[5]=0
mon[6]=0
mon[7]=0
mon[8]=0
mon[9]=0
mon[10]=0
mon[11]=0
mon[12]=0
while read line
do
month=`echo $line|cut -d'/' -f 2`
year=`echo $line|cut -d'/' -f 3 |cut -d':' -f 1`
#echo $year $month
if [ $# -eq 2 ]
then
if [ $1 = $year -a $2 = $month ]
then
count=`expr $count + 1`
fi
elif [ $# -eq 1 ]
then
if [ $1 = $year ]
then
case "$month"
in
Jan)mon[1]=`expr ${mon[1]} + 1`;;
Feb)mon[2]=`expr ${mon[2]} + 1`;;
Mar)mon[3]=`expr ${mon[3]} + 1`;;
Apr)mon[4]=`expr ${mon[4]} + 1`;;
May)mon[5]=`expr ${mon[5]} + 1`;;
Jun)mon[6]=`expr ${mon[6]} + 1`;;
Jul)mon[7]=`expr ${mon[7]} + 1`;;
Aug)mon[8]=`expr ${mon[8]} + 1`;;
Sep)mon[9]=`expr ${mon[9]} + 1`;;
Oct)mon[10]=`expr ${mon[10]} + 1`;;
Nov)mon[11]=`expr ${mon[11]} + 1`;;
Dec)mon[12]=`expr ${mon[12]} + 1`;;
esac
fi
fi
done test.html
if [ $# -eq 2 ]
then
grep -c $1.*$2 my_sample_log.txt|read mon1
echo $2 $1 $mon1
echo ''$1''$mon1'' >>test.html
elif [ $# -eq 1 ]
then
echo $1
for month in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
do
grep -c $month.*$1 my_sample_log.txt|read mon1
echo ''$1''$month''$mon1'' >>test.html
echo $month $mon1
done
fi
echo ' ' >>test.html