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