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

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

以上是 lua日志文件处理代码 的全部内容, 来源链接: utcz.com/z/315053.html

回到顶部