我做了一些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
我想能够parsing
n日志和输出特定的列,进行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