+ -
当前位置:首页 → 问答吧 → 使用shell / awk / sed 统计日志行数

使用shell / awk / sed 统计日志行数

时间:2011-05-15

来源:互联网

日志内容
180.171.230.214 - - - [14/May/2011:20:28:10 +0800] "GET /promotion/gyp/20100602/maoyitong/index
180.171.230.215 - - - [14/May/2011:20:28:14 +0800] "GET /promotion/gyp/20100602/maoyitong/index
.....
.....
.....
110.75.196.130 - - - [14/May/2011:20:40:45 +0800] "GET / HTTP/1.1" 200 1
159.140.25.218 - - - [14/May/2011:20:28:50 +0800]  "http://xxx.com"
117.121.32.185 - - - [14/May/2011:20:28:50 +0800] "GET /homepage-market-conditio

我想统计从 14/May/2011:20:28:10 到 14/May/2011:20:28:50 之间的所有日志行数,

使用 sed -n '/14\/May\/2011:20:28:10/,/14\/May\/2011:20:28:50 +0800/p'  只能打印  159.140.25.218 - - - [14/May/2011:20:28:50 +0800]  "http://xxx.com" 这条,这条后的同样时间的就不打印了,

请问使用shell / sed / awk 应怎么写呢?

作者: dmidecode   发布时间: 2011-05-15

  1. awk '/14\/May\/2011:20:28:10/,/14\/May\/2011:20:28:50 +0800/' urfile
复制代码

作者: Shell_HAT   发布时间: 2011-05-15

回复 dmidecode


sed -n '/14\/May\/2011:20:28:10/,/14\/May\/2011:20:28:50 \+0800/p'

作者: yinyuemi   发布时间: 2011-05-15

+0800前面加和不加\有什么区别,在awk和sed中分别有什么不同?

作者: Estwind   发布时间: 2011-05-15

回复 Estwind


    没有转义符+号是有特别意义的。

作者: zhnghaijin   发布时间: 2011-05-15

回复 yinyuemi

请问在前面为何不用加 +0800 ,在后面要加 +0800 这个呢,

我刚才试了一下,如果前面加 +0800 的话会任何东西都打印不出来!

作者: dmidecode   发布时间: 2011-05-15

本帖最后由 yinyuemi 于 2011-05-15 11:40 编辑

回复 dmidecode


试试下面的吧,我前面的回复不对,另外sed里的+不需要转义,

因为不管是awk还是sed, /foo1/,/foo2/的匹配的是第一个foo1到第一个foo2(对这点,以前的理解还是不到位啊),这也就是为什么你开始的代码无法打印出最个那行;
  1. cat test
  2. abc
  3. 180.171.230.214 - - - [14/May/2011:20:28:10 +0800] "GET /promotion/gyp/20100602/maoyitong/index
  4. 180.171.230.215 - - - [14/May/2011:20:28:14 +0800] "GET /promotion/gyp/20100602/maoyitong/index
  5. .....
  6. .....
  7. .....
  8. 110.75.196.130 - - - [14/May/2011:20:40:45 +0800] "GET / HTTP/1.1" 200 1
  9. 159.140.25.218 - - - [14/May/2011:20:28:50 +0800]  "http://xxx.com"
  10. 117.121.32.185 - - - [14/May/2011:20:28:50 +0800] "GET /homepage-market-conditio
  11. seg


  12. awk '/14\/May\/2011:20:28:10 \+0800/{p=1}/14\/May\/2011:20:28:50 \+0800/{print;p=0}p' test
  13. 180.171.230.214 - - - [14/May/2011:20:28:10 +0800] "GET /promotion/gyp/20100602/maoyitong/index
  14. 180.171.230.215 - - - [14/May/2011:20:28:14 +0800] "GET /promotion/gyp/20100602/maoyitong/index
  15. .....
  16. .....
  17. .....
  18. 110.75.196.130 - - - [14/May/2011:20:40:45 +0800] "GET / HTTP/1.1" 200 1
  19. 159.140.25.218 - - - [14/May/2011:20:28:50 +0800]  "http://xxx.com"
  20. 117.121.32.185 - - - [14/May/2011:20:28:50 +0800] "GET /homepage-market-conditio


  21. sed -n '/4\/May\/2011:20:28:10 +0800/,/14\/May\/2011:20:28:50 +0800/{
  22.         p
  23.         /14\/May\/2011:20:28:50 +0800/{
  24.                 :a
  25.                 n
  26.                 /14\/May\/2011:20:28:50 +0800/p
  27.                 /14\/May\/2011:20:28:50 +0800$/! b
  28.                 ta
  29.                 }
  30.         }' test

  31. 180.171.230.214 - - - [14/May/2011:20:28:10 +0800] "GET /promotion/gyp/20100602/maoyitong/index
  32. 180.171.230.215 - - - [14/May/2011:20:28:14 +0800] "GET /promotion/gyp/20100602/maoyitong/index
  33. .....
  34. .....
  35. .....
  36. 110.75.196.130 - - - [14/May/2011:20:40:45 +0800] "GET / HTTP/1.1" 200 1
  37. 159.140.25.218 - - - [14/May/2011:20:28:50 +0800]  "http://xxx.com"
  38. 117.121.32.185 - - - [14/May/2011:20:28:50 +0800] "GET /homepage-market-conditio
复制代码

作者: yinyuemi   发布时间: 2011-05-15

回复 yinyuemi


sed 和 awk 对于 /foo1/,/foo2/ 的处理是有区别的。
  1. $ cat urfile                    
  2. xxx
  3. foo1 foo2
  4. xxx
  5. foo2
  6. xxx
  7. $ sed -n '/foo1/,/foo2/p' urfile
  8. foo1 foo2
  9. xxx
  10. foo2
  11. $ awk '/foo1/,/foo2/' urfile   
  12. foo1 foo2
复制代码

作者: ly5066113   发布时间: 2011-05-15

回复 ly5066113


    多谢Tim兄指点,学习学习

作者: yinyuemi   发布时间: 2011-05-15