Batch file batch file可读取日志文件并统计特定日期登录的用户数

Batch file batch file可读取日志文件并统计特定日期登录的用户数,batch-file,login,Batch File,Login,我有一个日志文件,其中用户登录详细信息以以下格式存储: INFO ;servername;2016-02-16 01:50:12,user4@COM;Open Analysis;H5SeLhbEVUKA0ml-kFUw5-151708d6b3Y8Tz;/Metric/core/corePortal;Success;151708fdfgY INFO ;servername;2016-02-16 01:50:12,user3@COM;Open Analysis;H5SeLhbEVUKA0ml-k

我有一个日志文件,其中用户登录详细信息以以下格式存储:

 INFO ;servername;2016-02-16 01:50:12,user4@COM;Open Analysis;H5SeLhbEVUKA0ml-kFUw5-151708d6b3Y8Tz;/Metric/core/corePortal;Success;151708fdfgY
 INFO ;servername;2016-02-16 01:50:12,user3@COM;Open Analysis;H5SeLhbEVUKA0ml-kFUw5-151708d6b3Y8Tz;/Metric/core/corePortal;Success;151708fdfgY
 INFO ;servername;2016-02-17 01:50:12,user1@COM;Open Analysis;H5SeLhbEVUKA0ml-kFUw5-151708d6b3Y8Tz;/Metric/core/corePortal;Success;151708fdfgY
 INFO ;servername;2016-02-18 01:50:12,user2@COM;Open Analyss;H5SeLhbEVUKA0ml-kFUw5-151708d6b3Y8Tz;/Metric/core/corePortal;Success;151708fdfgY
要求:

我需要获得在特定日期登录的用户数。 例如:从上面的日志中,它应该会返回我,有2个用户(user4和user3)在2016-02-16登录。要求是批处理文件

@echo off
setlocal EnableDelayedExpansion

for /F "tokens=3 delims=; " %%a in (input.txt) do (
   set "d=%%a"
   set /A "users[!d:-=_!]+=1"
)

echo Users logged in on all dates:
set users

echo/
echo Users logged in on 2016-02-16: %users[2016_02_16]%
输出:

Users logged in on all dates:
users[2016_02_16]=2
users[2016_02_17]=1
users[2016_02_18]=1

Users logged in on 2016-02-16: 2

您可以在以下位置查看此解决方案中使用的数组方法的详细说明:

Aacini发布的方法将起作用,但FOR命令在处理大量数据时相当缓慢。如果您有非常大的文件,并且只需要在一个特定日期查找用户数量,我建议使用find命令,这会更快,因为迭代完全在该命令中进行

如果您假定日期仅出现在文件的日期数据字段中,则可以使用
FIND/C“date to FIND”path\filename
这将给出一行作为输出,包括文件名,并以找到的行数结束

如果怀疑文件中的其他数据字段中可能出现日期,则可能会使用以下代码:

@echo off
SETLOCAL enabledelayedexpansion
SET srcstring=insert your date here
SET file=insert your path and filename here
FOR /F "tokens=3 delims=; " %%F IN ('FIND "%srcstring%" %file%') DO (
IF "%%F"=="%srcstring%" (SET /A "count+=1")
)
echo %count% users found on date %srcstring%

它使用更快的命令
FIND
查找显示日期的所有行,然后使用较慢的
FOR
检查日期是否显示在行的右侧数据字段中。由于
FOR
只遍历包含日期的行,因此速度会明显加快。

您从不说明日志中是否有不同格式的非登录行。我假设有

您也从不声明登录行的哪一部分是静态的。我将假设只有日期/时间和用户名更改。因此,此代码只计算成功的连接数。您必须调整代码以符合您的实际情况

如果您只想打印出计数,那么可以使用FINDSTR和正则表达式来选择相关行,并通过管道将其查找以对行进行计数

下面的代码期望所需的日期以YYYY-MM-DD格式作为参数传递

@echo off
:CountSuccessfulLogins  date
set "dt=%~1"
set "prefix= INFO ;servername;"
set "suffix= .*;Open Analysis;H5SeLhbEVUKA0ml-kFUw5-151708d6b3Y8Tz;/Metric/core/corePortal;Success;151708fdfgY"
findstr /rc:"^%prefix%%dt%%suffix%$" test.log | find /c /v ""
exit /b
如果要在变量中输入计数,请使用FOR/F捕获输出

@echo off
:CountSuccessfulLogins  date
set "dt=%~1"
set "prefix= INFO ;servername;"
set "suffix= .*;Open Analysis;H5SeLhbEVUKA0ml-kFUw5-151708d6b3Y8Tz;/Metric/core/corePortal;Success;151708fdfgY"
for /f %%N in ('findstr /rc:"^%prefix%%dt%%suffix%$" test.log ^| find /c /v ""') do set cnt=%%N
echo %cnt% Successful Logins on %dt%
exit /b

到目前为止你试过什么?在最简单的形式中,您只需使用
FIND
命令。您只有一个非常小的采样,并且不知道可能发生的其他事情,很难提供防弹代码。但正如我以最简单的形式所说的,这将基于您的示例:
find/C“2016-02-16”logfile.txt
,如果user4在同一天登录3次呢?这算3还是1?@dbenham:算3。我只是看看门户网站一天有多少次点击。谢谢@Aacini。它工作得很好。我将浏览您提供的链接。再次感谢。如果你认为这个答案对你有帮助,你可以选择它的复选标记,然后,当你有足够的代表时,再投票给它。这是我们在这个网站上说“谢谢”的方式。。。