Board logo

标题: [文本处理] 求助!!log文件中数据去重统计问题 [打印本页]

作者: 低手进阶    时间: 2008-9-2 14:28     标题: 求助!!log文件中数据去重统计问题

请高手给予解答:
手中有一个日志文件,记载了大量的日志信息,某一条日志格式如下:
*****01/Sep/2008:00:00:59 +0800] "GET /error_log/dll.htm&type=uninstall?dt=2008-08-31&ecs=3.8.8.21&*******&*****
我想要去重查找ecs=?的信息的个数。
比如包含ecs=3.8.8.21这个字符串的信息的条数。
作者: pusofalse    时间: 2008-9-2 15:01

  1. @echo off
  2. for /f "delims=" %%a in ('findstr/n "\<ecs\>" logfile.log') do echo %%a&set/a n+=1
  3. echo %n%条信息。
  4. pause
复制代码

作者: 低手进阶    时间: 2008-9-2 15:14

非常感谢您给我回帖!
俺想弱弱的问一下,这个批处理执行结果就是告诉我一共有多少条日志信息,我想要的是
ecs=3.8.8.1  10条
ecs=3.8.8.2   15条



这种形式。是我没表述清楚!
作者: pusofalse    时间: 2008-9-2 15:21

最好把你的LOG文件贴上来,如果过大,贴一部分好了。
作者: 低手进阶    时间: 2008-9-2 15:31

  1. * - - [01/Sep/2008:00:00:36 +0800] "GET /error_log/dll.htm&type=uninstall?dt=2003-10-17&ecs=3.8.8.21&*&aid=429 HTTP/1.1" 404 314 "-" "*"
  2. *- - [01/Sep/2008:00:00:41 +0800] "GET /error_log/dll.htm&type=uninstall?dt=2008-09-01&ecs=3.8.8.21&*&aid=429 HTTP/1.1" 404 314 "-" "*"
  3. *- - [01/Sep/2008:00:00:59 +0800] "GET /error_log/dll.htm&type=uninstall?dt=2008-08-31&ecs=3.8.8.21&*&aid=429 HTTP/1.1" 404 314 "-" "*"
  4. *- - [01/Sep/2008:00:01:13 +0800] "GET /error_log/dll.htm&type=uninstall?dt=2008-09-01&ecs=3.8.3.1&*&aid=429&gpu=ATI%20Mobility%20Radeon%20X1300&cpu=Intel(R)%20Core(TM)%20Duo%20CPU%20%20%20%20%20%20T2250%20%20@%201.73GHz HTTP/1.1" 404 314 "-" "*"
  5. *- - [01/Sep/2008:00:01:53 +0800] "GET /error_log/dll.htm&type=uninstall?dt=2008-09-01&ecs=3.8.8.21&*&aid=429 HTTP/1.1" 404 314 "-" "*"
  6. *- - [01/Sep/2008:00:02:22 +0800] "GET /error_log/dll.htm&type=uninstall?dt=2008-09-01&ecs=3.8.8.21&*&aid=429 HTTP/1.1" 404 314 "-" "*"
  7. *- - [01/Sep/2008:00:02:27 +0800] "GET /error_log/dll.htm&type=uninstall?dt=2008-09-01&ecs=3.8.8.30&*&aid=429&gpu=ATI%20Radeon%209550%20/%20X1050%20Series&cpu=%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Intel(R)%20Celeron(R)%20CPU%202.53GHz HTTP/1.1" 404 314 "-" "*"
复制代码
这是log文件的的几条记录!真的很大!

[ 本帖最后由 pusofalse 于 2008-9-2 15:34 编辑 ]
作者: Batcher    时间: 2008-9-2 15:41

  1. @echo off
  2. for /f "tokens=3 delims=&" %%a in ('findstr /i "ecs=" "a.log"') do (
  3.   for /f "tokens=2 delims==" %%b in ("%%a") do (
  4.     if not defined ecs%%b (
  5.   set ecs%%b=1
  6. ) else (
  7.   set /a ecs%%b+=1
  8. )
  9.   )
  10. )
  11. for /f "tokens=1-2 delims==" %%a in ('set ecs') do (
  12.   echo %%a %%b条
  13. )
复制代码

作者: pusofalse    时间: 2008-9-2 15:45

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=6 delims==&" %%a in ('findstr "\<ecs\>" l.log') do set "var=%%a"&set/a _!var!+=1
  3. for /f "tokens=1,2 delims=_=" %%a in ('set _') do echo ecs=%%a %%b条
  4. pause>nul
复制代码

作者: 低手进阶    时间: 2008-9-2 15:53

谢谢版主和巡查!:D
作者: 低手进阶    时间: 2008-9-2 16:31

再次请教版主,我本想修改你给的代码再执行类似的去重,"uid=*"输入到一个txt文件,可是频频出错!
212.0.5.45 - - [01/Sep/2008:00:00:36 +0800] "GET /error_log/dll.htm&type=uninstall?dt=2003-10-17&ecs=3.8.8.21&*=3.8.8.15&*=3.8.8.21&*=3.8.8.15&meedb.dll=3.8.8.15&MediaLib.dll=3.8.8.15&*=3.8.8.1&splayers.dll=3.8.8.15&rndrmgr.dll=3.8.8.15&*=3.8.8.15&video.dll=3.8.8.15&subdecoder.dll=3.8.6.30&gifparser.dll=3.8.5.18&spfa.dll=3.8.8.1&uninst.exe=3.8.8.15&pid=&uid={5B70HA11-15W0-4CE6-B167-60884Y4AA80B}&aid=429 HTTP/1.1" 404 314 "-" "*"
我是不是修改一下tokens就可以了?
作者: Batcher    时间: 2008-9-2 16:38     标题: 回复 9楼 的帖子

你应该先自己试试修改一下tokens行不行,不行再提问。
作者: 低手进阶    时间: 2008-9-2 16:44

汗,我修改的错误百出!我刚刚才接触批处理,有点。。。。
谢谢指教
作者: pusofalse    时间: 2008-9-2 16:53

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=2 delims={}" %%a in ('findstr/i "\<uid\>" l.log') do set "var=%%a"&set/a _!var!+=1
  3. for /f "tokens=1,* delims=_=" %%a in ('set _') do echo uid={%%a} %%b条
  4. pause>nul
复制代码

作者: 低手进阶    时间: 2008-9-2 17:14     标题: 测试结果

无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
。。。。。。
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
环境变量 _ 没有定义
十分感谢版主回复,原来不只是改tokens啊
作者: 低手进阶    时间: 2008-9-2 18:05

晕了,没招了。改不明白
作者: pusofalse    时间: 2008-9-2 18:13

我这里测试没问题。
作者: 低手进阶    时间: 2008-9-2 18:25

啊!哦。。。。。
连代码都。。。我
作者: 低手进阶    时间: 2008-9-2 18:44

版主大人,经过我反反复复的试验,还是不能执行第二个代码(uid的那个),就是显示

无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
环境变量 _ 没有定义

晕死了
作者: pusofalse    时间: 2008-9-2 18:59     标题: 回复 17楼 的帖子

我明白原因了。。。试下这样!
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=2 delims={}" %%a in ('findstr/i "\<uid\>" l.log') do (
  3. set "var=%%a"
  4. set/a _!var:-=#!+=1
  5. )
  6. for /f "tokens=1,* delims=_=" %%a in ('set _') do (
  7. set var=%%a
  8. echo uid={!var:#=-!} %%b条
  9. )
  10. pause>nul
复制代码

作者: terse    时间: 2008-9-2 19:48

针对楼主的格式写一个  不通用
  1. @echo off
  2. for /f "tokens=10-13 delims==*& " %%a in (1.log) do set/a _%%a_%%b+=1&set/a _%%c_%%d+=1
  3. for /f "tokens=1-3 delims=_=" %%a in ('set _') do echo %%a=%%b  %%c 条
  4. pause>nul
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2