[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已结】请教一段日志分析批处理程序

这是一段暗黑游戏日志记录,我只能过滤到这个状态,但很不清晰。
希望的效果是,第一个ID进入后,没有退出之前,还有哪些同IP地址的ID进入。
17:47 D2GSCBEnterGame *yeshou 67.166.37.67  ——————时间、进入游戏标志、ID、IP地址
17:47 D2GSCBEnterGame *jh 121.26.36.92
17:47 D2GSCBEnterGame *zx00147 120.0.116.133
17:47 D2GSCBEnterGame *cjymr3 125.37.196.222
17:47 D2GSCBEnterGame *yeshou4 67.166.37.67 ————————另一个ID进入,IP相同,应该为同一个人
17:47 D2GSCBLeaveGame *TS-25 leave
17:48 D2GSCBLeaveGame *sosll leave
17:48 D2GSCBLeaveGame *love_gege leave
17:48 D2GSCBLeaveGame *rui leave
17:48 D2GSCBLeaveGame *yeshou leave ———————第一个进入者退出
17:48 D2GSCBLeaveGame *zx00147 leave
17:48 D2GSCBEnterGame *TS-25 124.119.7.206
17:48 D2GSCBEnterGame *sosll 123.121.244.213
17:48 D2GSCBLeaveGame *eq leave
17:48 D2GSCBEnterGame *zx00147 120.0.116.133
17:48 D2GSCBEnterGame *jingran1 121.22.148.89
17:48 D2GSCBEnterGame *love_gege 122.142.175.247
17:48 D2GSCBEnterGame *eq 121.22.148.89
17:48 D2GSCBLeaveGame *jingran1 leave
17:48 D2GSCBEnterGame *wabc185 60.26.192.176
17:48 D2GSCBLeaveGame *yeshou4 leave ————————第二个进入ID退出


需要结果大致是这样:
IP地址作为命令行中的变量,搜索该IP的账号出入情况:

17:47 D2GSCBEnterGame *yeshou 67.166.37.67
17:47 D2GSCBEnterGame *yeshou4 67.166.37.67
17:48 D2GSCBLeaveGame *yeshou leave
17:48 D2GSCBLeaveGame *yeshou4 leave


不知道批处理能不能实现,先谢谢各位了。

用P当然可以,只不过速度慢了。。。

for读全部IP,然后分别用findstr查找一次。。。

TOP

这个应该可以。
The log file name is log.txt.
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set "ip=67.166.37.67"
  4. set "name=0"
  5. set "find=0"
  6. for /f "tokens=1,2,3,4" %%a in (log.txt) do (if "%%d"=="%ip%" (set /a name+=1 & set "!name!
  7. =%%c" & echo %%a %%b %%c %%d) else (set "na=%%c" & call :check & if "!find!"=="1" ( echo %%a
  8. %%b %%c %%d)) & set "find=0" )
  9. :check
  10. for /l %%i in (1,1,%name%) do (if "!%%i!"=="!na!" (set "find=1"))
复制代码

TOP

  1. @echo Off & setlocal EnableDelayedExpansion
  2. cd.>l.x & cd.>i.x & cd.>result.x
  3. For /f "tokens=1-4" %%a in ('sort log.txt') do (
  4.        If "%%d" equ "leave" (set "txt=l.x") else (set "txt=i.x")
  5.        echo %%d %%a %%c>>!txt!
  6. )
  7. For /f "tokens=1-3" %%a in (i.x) do (
  8.        If "%%a" equ "!Addr!" (
  9.            Call :Find !_%%a! %%b && (
  10.                  For /f "tokens=1-3" %%d in ('Findstr /I "\%%c$" l.x') do (echo %%~e D2GSCBLeaveGame %%~f %%~d)
  11.                  For /f "tokens=1-3" %%d in ("!_%%a!") do (echo %%e D2GSCBLeaveGame %%~f %%~d)
  12.                  Echo %%b D2GSCBLeaveGame %%c %%a
  13.            )
  14.        )
  15.        set "_%%a=%%a %%b %%c"
  16.        set "Addr=%%a"
  17. )>>result.x
  18. sort result.x & del result.x, l.x, i.x
  19. Pause>nul & Exit /b
  20. :Find
  21. For /f "tokens=1-3" %%a in ('findstr /i "\%3$" l.x') do (
  22.         If "%%b" gtr "%2" (Echo %%b D2GSCBLeaveGame %%c %%a& Exit /b 0) else (Exit /b 1)
  23. )
复制代码
心绪平和,眼藏静谧。

TOP

回复 3楼 的帖子

非常感谢!
除了有点慢之外,结果非常理想!
这段程序,要好好学习,说真的,确实看不懂。佩服!

TOP

感谢4楼版主老大,试了您的程序,好像您把进入和退出做了排序,进出分开了,这样就很难查出某人进出的时间段内,其他的相同ID是不是也进入了游戏。

也感谢3楼的前辈,日志大概在3~9M之间,分析一个IP出来,现在需要1小时或者更长。能否再将其优化一下,提高下速度?
谢谢各位前辈了!

TOP

把这个批处理放到游戏的那个地方???
顶顶

TOP

批处理干高质量的活效率实在低。。。

我觉得快的方法应该是统计EnterGame里面相同IP出现的次数,大于2就说明有马甲呗。。。

TOP

回复 8楼 的帖子

暗黑的一个玩家进游戏后,建立一个房间,杀一个固定的BOSS(掉落装备几率高),然后重新建立一个房间再杀这个BOSS。一些老手平均每2分钟建立一个房间是正常的。所以会频繁的出现D2GSCBEnterGame D2GSCBLeaveGame .
但有人会使用外挂,暗黑里是属于作弊行为。作弊账号本身,不是仓库,连带账号才是仓库。所以,要查连带账号。
查外挂根据另外一些日志记录特征和游戏中确认等方法,一旦追踪到某个账号有外挂,就要沿着IP地址继续追查。
追查的思路是,如果外挂账号和另一个账号,再同时间、同IP地址进入游戏,就可以确定这个作弊者的另一个账号。以此类推,查出更多的连带账号。

TOP

  先不说代码,说说思路:既然是通过进出时间和IP来判断,那么,可以把原始数据重新排序:第一列存放时间,第二列存放IP,第三列存放ID,第四列存放进出游戏的标志(第一二列的存放顺序不能随意颠倒,这是关键,第三四列的数据就无所谓了),保存到新文件new1中,然后,用sort重排这份新文件,得到第二份新文件new2,这样,相同时间、相同IP的数据全部存放到相邻的行中,再用批处理来做就很简单了。

  生成new1文件,可以用批处理来做,但是速度比较慢,推荐使用excel来处理:把原始数据导入excel中,然后,通过鼠标的拖曳,可以很容易地交换两列数据。

  生成new2文件,用excel来处理比批处理更高效,推荐使用excel。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

不说批处理先,同一个IP在同一个房间里面有多个号,不代表是同一个人的,假如是局域网、无线网呢?这样判定作弊不太好,再说现在带号练级、双开的现象又不是没有,只要是网游就会有的。。。

TOP

最后提供一个效率最高最快的思路。。。
利用Findstr的/n功能查找IP,得到进入游戏的行及其行号,然后读出游戏名,再用Findstr查找退出游戏的行及其行号,如果两个退出游戏的行号之间有多个进入游戏的行号说名是作弊。。。

TOP

返回列表