如何parsingNCSA组合的日志文件

我做了一些site:在服务器故障,超级用户和堆栈溢出谷歌search。 我也检查了非网站的具体结果,并没有真正看到这样的问题,所以这里去…

我确实发现了这个问题,涉及到grep和awk ,这些知识有一些很好的知识,但我不觉得文本资格authentication挑战已经解决。 这个问题也扩大到任何平台和任何程序的范围。

我有基于NCSA组合格式的鱿鱼或apache日志。 当我说的基础上,意味着文件中的第一个字符是根据NCSA组合标准,可能会有更多的字符与自定义的东西。

以下是一个来自鱿鱼组合日志的示例行:

 1.1.1.1 - - [11/Dec/2010:03:41:46 -0500] "GET http://yourdomain.com:8080/en/some-page.html HTTP/1.1" 200 2142 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; C) AppleWebKit/532.4 (KHTML, like Gecko)" TCP_MEM_HIT:NONE 

我想能够parsingn日志和输出特定的列,进行sorting,计数,find唯一的值等

主要的挑战是什么使它有点棘手,也是为什么我觉得这个问题还没有被提出或回答,是文本资格的难题

当我从grep / awk问题中发现asql的时候,我非常兴奋,但是后来才意识到,它不支持在箱子里面结合使用,我想要扩展一下。

期待答案,学习新东西! 答案不一定限于平台或程序/语言。 在这个问题的背景下,我使用最多的平台是Linux或OSX。

干杯

使用Perl,在为darwin-thread-multi-2level(OSX)构build的v5.10.0上testing,

要打印UserAgent列:

 perl -n -e '/^([^ ]+) ([^ ]+) ([^ ]+) (\[[^\]]+\]) "(.*) (.*) (.*)" ([0-9\-]+) ([0-9\-]+) "(.*)" "(.*)"/; print "$11\n"' -- test.log 
  • test.log每一行选项-n
  • 选项-e一行程序

我偷了,并调整了从PHP食谱 Googlesearch的perlre。 我从re的结尾删除了$ ,以支持基于NCSA组合的自定义格式。 该模式可以很容易地扩展到提供更多的组。

正则expression式groups ()最终成为局部variables$1$n

快速,肮脏,很容易扩展和脚本。

pipe道输出的一些例子:

  • | sort | uniq | sort | uniq独特的列值
  • | sort | uniq | wc -l | sort | uniq | wc -l独特的列数

批评和改进的欢迎

虽然它不直接解决文本限定问题,但组合格式中可以利用的一个因素是,其余空格分隔的列始终位于同一列中。 因此,您可以通过使用printf和NF(列数)循环来解决此问题,

根据awk,$ 0是整个input行,$ 1是第一列,$ 2是第二个,$ NF是最后一个。

因此,对于一个标准的NCSA组合,用户代理是列$ 13到列$ NF

我需要删除第一列,并与修改的日志格式的最后一列交换(代理IP添加到最后一列)。

所以应该返回的是$ NF栏,然后是第二栏($ 2),然后剩下的栏通过NF – 1

我能够做到以下几点:

 awk '{ printf "%s ", $NF; for (i=2; i<=NF-1; i++) printf "%s ", $i; printf "\n";}' < /var/log/nginx/access.log