lua日志文件处理代码

    目前我找到的文件夹的搜索工具,最多可以完成把搜索到的单行的内容,进行输出出来,或者进行一些简单的处理,但是不够灵活。

    因此就用lua自己写了个,可以完成自己定义搜索处理函数,进行一些数据的处理,省去了将搜索结果放到excel中再处理的过程。

    
    -- search_log.lua
    
    tbResult = {};
    tbCmdResult = {};
    
    local szTmpFolderPath = os.getenv("temp");
    if not szTmpFolderPath then
     os.execute("md c:\\temp")
     szTmpFolderPath = "c:\\temp";
    end
    
    local tbSpecialWorld =
    {
     ["("] = "%(", [")"] = "%)", ["."] = "%.", ["%"] = "%%",
     ["+"] = "%+", ["-"] = "%-", ["*"] = "%*", ["?"] = "%?",
     ["["] = "%[", ["]"] = "%]", ["^"] = "%^", ["$"] = "%$",
    };
    function FormatCmd(szCmd)
     return string.gsub(szCmd, ".", function(s) return tbSpecialWorld[s] or s; end)
    end
    
    function FormatPath(szPath)
     string.gsub(szPath, "[\\/]$", "");
     return string.gsub(szPath, "/", "\\");
    end
    
    function CheckFile(szFilePath)
     local file = io.open(szFilePath, "rb");
     if not file then
       return;
     end
     file:close();
     return true;
    end
    
    function OpenFile(szFilePath)
     if not CheckFile(szFilePath) then
       return;
     end
    
     local tbFile = {};
     for line in io.lines(szFilePath) do
       table.insert(tbFile, line);
     end
    
     return tbFile;
    end
    
    function SearchFile(szFilePath, szCmd, fnCmd2Line, fnFileName)
     local tbFile = OpenFile(szFilePath);
     if not tbFile then
       return;
     end
    
     tbResult[szFilePath] = tbResult[szFilePath] or {};
     local szCmdResult = "";
     for nLine, szLine in ipairs(tbFile) do
       if string.match(szLine, szCmd) then
         szCmdResult = fnCmd2Line(szLine);
         if szCmdResult and szCmdResult ~= "" then
           table.insert(tbCmdResult, szCmdResult);
         end
         table.insert(tbResult[szFilePath], nLine .. ":" .. szLine);
       end
     end
    
     return 1;
    end
    
    function Cmd2Line(szLine)
     return;
    end
    
    function CheckName(szFileName)
     return true;
    end
    
    function SearchDir(szFolderPath, szCmd, fnCmd2Line, fnCheckName, nIdx)
     if not szCmd or szCmd == "" then
       return;
     end
    
     local fnCmd2Line = fnCmd2Line or Cmd2Line;
     local fnCheckName = fnCheckName or CheckName;
     local nIdx = nIdx or 0;
    
     local szTmpFileName = szTmpFolderPath .. "\\SearchDirTemp" .. nIdx .. ".tmp";
     os.execute("dir /b ".. szFolderPath .." >" .. szTmpFileName);
    
     local tbFile = OpenFile(szTmpFileName);
     if not tbFile or #tbFile == 0 then
       return;
     end
    
     local szPath = "";
     for _, szFileName in ipairs(tbFile) do
       szPath = szFolderPath .. "\\" .. szFileName;
       if not CheckFile(szPath) then
         SearchDir(szPath, szCmd, fnCmd2Line, nIdx + 1);
        else
          if CheckName(szFileName) then
            SearchFile(szPath, szCmd, fnCmd2Line);
          end
        end
      end
    end
    
    function Write2File(szInfo, szFilePath)
      local file = io.open(szFilePath, "w");
      if not file then
        print(szInfo);
        print("Write2File ERR ?? not file " .. szFilePath);
        return;
      end
    
      file:write(szInfo);
      file:close();
    end
    
    function DoSearchDir(szFolderPath, szCmd, tbParam)
      if not szFolderPath or szFolderPath == "" or not szCmd or szCmd == "" then
        return;
      end
     
      tbParam = tbParam or {};
    
      szFolderPath = FormatPath(szFolderPath);
      if tbParam.bIsMatch then
        szCmd = FormatCmd(szCmd);
      end
      local nTime = os.time();
      SearchDir(szFolderPath, szCmd, tbParam.fnCmd2Line or Cmd2Line, tbParam.fnCheckName or CheckName, 0);
      nTime = os.time() - nTime;
      print("搜索用时:" .. nTime);
    
      local szResultPath = tbParam.szResultPath or (szTmpFolderPath .. "\\result.tab.tmp");
      local szResult = "";
      for szFilePath, tbInfo in pairs(tbResult) do
        szResult = szResult .. szFilePath .. "\n";
        for _, szLine in pairs(tbInfo) do
          szResult = szResult .. szLine .. "\n";
        end
      end
      Write2File(szResult, szResultPath);
    
      local szCmdResult = "";
      for _, szLine in pairs(tbCmdResult) do
        szCmdResult = szCmdResult .. szLine .. "\n";
      end
      Write2File(szCmdResult, tbParam.szCmdResultPath or (szTmpFolderPath .. "\\cmd_result.tab.tmp"));
    end
    
    --tbParam =
    --{
    --  bIsMatch = false;  -- 是否使用正则方式搜索
    --  fnCmd2Line = function () end; -- 自定义搜索行内容处理函数
    --  fnCheckName = function () end; -- 文件名限定函数
    --  szResultPath = "e:\\result.tab"; -- 文件搜索内容输出路径
    --  szCmdResultPath = "e:\\cmd_result.tab"; -- 自定义处理函数返回内容储存路径
    --}
    
    

    使用代码可以如下(貌似支持网络路径的):

    
    dofile("e:\\search_log.lua");
    tbTmpInfo = {};
    function CheckInfo(szLine)
     local szPlayerName, nPlayerId, nCount = string.match(szLine, "^.*szType = final\t[^\t]+\t%d+\t([^\t]+)\t(%d+)\t(%d+).*$");
     nPlayerId = tonumber(nPlayerId);
     nCount = tonumber(nCount);
     if nCount > tbTmpInfo[nPlayerId] then
       tbTmpInfo[nPlayerId] = nCount;
        return "" .. nPlayerId .. "\t" .. nCount;
      end
      return;
    end
    tbParam =
    {
      bIsMatch = false;
      fnCmd2Line = CheckInfo;
      fnCheckName = function () return true; end;
      szResultPath = "e:\\result.tab";
      szCmdResultPath = "e:\\cmd_result.tab";
    }
    DoSearchDir("d:\\logs", "szType = final", tbParam);
    for _, szInfo in pairs(tbTmpInfo) do
      print(szInfo);
    end
    

    唯一不满意的地方貌似是搜索速度有点慢,以后有空再调整吧,现在这个暂时够用了,至少比原来方便多了~~