我有一个Apache access.log文件,大小约为35 is。无需等待很长时间,就不再是一个选择。
我想通过使用日期作为拆分标准,将其拆分成许多小文件。
日期采用[15/Oct/2011:12:02:02 +0000]
格式。你知道我如何只使用bash脚本,标准的文本操作程序(grep,awk,sed,和like),管道和重定向吗?
输入文件名为access.log
。我希望输出文件采用像access.apache.15_Oct_2011.log
这样的格式(这样就可以了,尽管在排序时不是很好)。
发布于 2012-07-30 09:14:29
使用awk
的一种方式
awk 'BEGIN {
split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ", months, " ")
for (a = 1; a <= 12; a++)
m[months[a]] = sprintf("%02d", a)
}
{
split($4,array,"[:/]")
year = array[3]
month = m[array[2]]
print > FILENAME"-"year"_"month".txt"
}' incendiary.ws-2009
这将输出如下所示的文件:
incendiary.ws-2010-2010_04.txt
incendiary.ws-2010-2010_05.txt
incendiary.ws-2010-2010_06.txt
incendiary.ws-2010-2010_07.txt
与150MB的日志文件相比,chepner在3.4 GHz 8 Core Xeon E31270上的回答花费了70秒,而这种方法只需要5秒。
发布于 2012-07-27 21:44:27
纯bash,让一个人通过访问日志:
while read; do
[[ $REPLY =~ \[(..)/(...)/(....): ]]
d=${BASH_REMATCH[1]}
m=${BASH_REMATCH[2]}
y=${BASH_REMATCH[3]}
#printf -v fname "access.apache.%s_%s_%s.log" ${BASH_REMATCH[@]:1:3}
printf -v fname "access.apache.%s_%s_%s.log" $y $m $d
echo "$REPLY" >> $fname
done < access.log
发布于 2012-07-27 20:38:47
Perl来拯救我们:
cat access.log | perl -n -e'm@\[(\d{1,2})/(\w{3})/(\d{4}):@; open(LOG, ">>access.apache.$3_$2_$1.log"); print LOG $_;'
好吧,它不完全是“标准”的操作程序,但它是为文本操作而设计的。
我还更改了文件名中参数的顺序,这样文件的名称就像access.apache.yyyy_mon_dd.log一样,便于排序。
https://stackoverflow.com/questions/11687054
复制相似问题