我有一个文件夹用户日志,它分别包含每个用户的日志文件。现在,我想在整个日志文件中搜索特定文本,并获取该文本的最后5个条目。 在每个日志文件中,行输入的日期和时间可用,如
2017-10-05 15:43:32 pm--abcd--192.9.200.232--183--Select Date--NA--NA--Edit-05-10-2017
CODE:
function getUserLog($path_to_check, $search)
{
$result = array();
foreach (glob($path_to_check . '*.txt') as $filename) {
foreach (file($filename) as $lineNumber => $line) {
if (strpos($line, $search) !== false) {
$fil_name= basename($filename,".txt");
$result[] = $line."--".$fil_name;
}
}
}
return $result;
}
$path_to_check = "userlogs/";
if ( is_dir($path_to_check)) {
$user_log = getUserLog($path_to_check,$cino);
}
答案 0 :(得分:1)
您可以做的是将文件名存储为数组键(只要文件名是有效的array键),然后将匹配的行(忽略换行符)添加到该数组。
最后添加具有文件名作为键的数组以及匹配的行到s.scan(/((\w)\2*)/).map(&:first)
# => ["aaaaaaa", "bbbbbbbb", "c"]
。
然后,您可以循环$result
,并使用array_slice从$user_log
获取最后5个,并将其添加到新数组$matchedLines
。
例如:
$resultSliced
然后您的结果将具有如下结构:
function getUserLog($path_to_check, $search)
{
$result = array();
foreach (glob($path_to_check . '*.txt') as $filename) {
foreach (file($filename, FILE_IGNORE_NEW_LINES) as $lineNumber => $line) {
if (strpos($line, $search) !== false) {
$fil_name = basename($filename, ".txt");
$result[$fil_name][] = $line;
}
}
}
return $result;
}
$resultSliced = [];
$path_to_check = "userlogs/";
if (is_dir($path_to_check)) {
$user_log = getUserLog($path_to_check, $cino);
foreach ($user_log as$fileName => $matchedLines) {
$resultSliced[$fileName] = array_slice($matchedLines, -5, 5, true);
}
}