首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用命令行工具按日期拆分access.log文件

使用命令行工具按日期拆分access.log文件
EN

Stack Overflow用户
提问于 2012-07-27 19:41:43
回答 6查看 18.9K关注 0票数 17

我有一个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这样的格式(这样就可以了,尽管在排序时不是很好)。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-07-30 09:14:29

使用awk的一种方式

代码语言:javascript
复制
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

这将输出如下所示的文件:

代码语言:javascript
复制
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秒。

原创灵感:"How to split existing apache logfile by month?

票数 22
EN

Stack Overflow用户

发布于 2012-07-27 21:44:27

纯bash,让一个人通过访问日志:

代码语言:javascript
复制
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
票数 10
EN

Stack Overflow用户

发布于 2012-07-27 20:38:47

Perl来拯救我们:

代码语言:javascript
复制
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一样,便于排序。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11687054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档