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

[文本处理] 批处理如何提取防火墙日志中的关键信息字段?

单位的小网管,因为安全的需要,需要保存防火墙外网的转换日志。
但一天的日志量很大,基本上白天每小时有400M左右的文件。一天下来,有10G左右。
这些文件虽然是TXT文本格式,但是因为太大,而不便于打开查询。而且里面无用的信息也比较多。
所以提取有用信息字段,进行压缩,以便存档,进行日后查询,便成了这次的问题的探讨的焦点。

但是这种文件居然批处理不能读取。原来是以为文件过大引起,对原文件删除了一些信息之后,还是不能读取。
用ULTRAEDIT打开发现,这文件是16位ASCII的文件。论坛上搜索了一下,用批处理转换的方法,也没效果。

原来用的批处理是:
  1. @echo off
  2. h:
  3. for /f "tokens=6,7,8,10,17,18,19,20,21,22 delims= " %%i in (aa1.txt) do ( echo %%i %%j %%k %%l %%m %%n %%o %%p %%q %%r>>44.txt)
复制代码
单用一个%%i 也不可以。
看来,用批处理处理这类文档,受到了限制。

在实际用批处理中,原来以为是文本超长行引起,仔细检查后发现,文本里面是有回车,和换行符的。0A=13,0D=10.并非是超长行的问题。
说明这个文本不适合用批处理来进行处理。
在版主BATMAN的热心帮助下,给我写出了这段代码。
Dim FSO, Arr, vbStr, Str, vbOut, Arr1, Str1, Code
Code = Split(Chr(34) & " duration= service= sent= rcvd= src= dst=", " ")
Set FSO = CreateObject("Scripting.FileSystemObject")
vbStr = FSO.OpenTextFile("22.txt").ReadAll()
Arr = Split(vbStr, vbCrLf)
FSO.CreateTextFile("new.txt", 1, 0).Write vbNullString
For Each Str In Arr
  Arr1 = Split(Str, " ")
    For Each Str1 In Arr1
      For i = 0 To UBound(Code)
        If InStr(Str1, Code(i)) Then vbOut = vbOut & Str1 & " "
      Next
    Next
  FSO.OpenTextFile("new.txt", 8).WriteLine vbOut
  vbOut = vbNullString
Next
MsgBox "ok"
Set FSO = Nothing

运行后生成的文件,提取了相关重要的信息字段,完全符合要求

TOP

在这里非常感谢BATMAN的热心指导和批处理论坛众网友的无私解答和共同探讨。

本人也是VBS初学者。
下面对BATMAN的源码作出一些相关的解释。不恰当之处,多多海涵。
Dim FSO, Arr, vbStr, Str, vbOut, Arr1, Str1, Code  /*定义变量或数组*/
Code = Split(Chr(34) & " duration= service= sent= rcvd= src= dst=", " ")  /*把要提取的关键字字段信息写入数组中,关键字分别是 " duration service sent rcvd src dst*/
Set FSO = CreateObject("Scripting.FileSystemObject")  /*创建系统文件对象*/
vbStr = FSO.OpenTextFile("22.txt").ReadAll()  /*把所有源文本信息读取到vbstr字符串中*/
Arr = Split(vbStr, vbCrLf)  /* 把所有的文本以换行符为分界符,依次写入到Arr数组中*/
FSO.CreateTextFile("new.txt", 1, 0).Write vbNullString  /*创建新的文本文件,以便保存提取的信息*/
For Each Str In Arr   /*以下对Arr数组中的每条记录进行关键字信息提取*/
  Arr1 = Split(Str, " ")     /*对每条记录按空格符为界提取字段*/
    For Each Str1 In Arr1     /*以下小循环提取关键字*/
      For i = 0 To UBound(Code)  
        If InStr(Str1, Code(i)) Then vbOut = vbOut & Str1 & " " /*判断每条记录中按空格提取的字段是不是所要的关键字信息,如是加入到字符串变量中*/
      Next
    Next
  FSO.OpenTextFile("new.txt", 8).WriteLine vbOut /*提取的关键字写入到新文件中*/
  vbOut = vbNullString /*字符串变量指空*/
Next
MsgBox "ok"
Set FSO = Nothing  /*对象指针为空*/

TOP

进行处理后,信息压缩良好。
原来一个110M的文件,现在只有11M多一点。
压缩有原来的8-10倍。

TOP

写的非常好,请问 For i = 0 To UBound(Code) 这句中的UBound是什么意思?

TOP

使劲顶白塔曼童鞋一下

TOP

使劲顶白塔曼童鞋一下

TOP

使劲的顶一会

TOP

返回列表