美好的一天。
我有一堆FTP日志。现在我想知道哪些用户在给定的时间范围内使用FTP。现在我将该时间范围内的一堆日志文件复制到一个文件夹中,因此我希望有一个批处理脚本执行以下操作:通过文件夹中的所有日志文件,并搜索以下术语,这些术语是唯一的日志文件中列出的所有用户:
USER stblma 331
其中 stblma 是用户。所以'USER'和'331'将成为日志上所有登录的标准,但仅在USER上过滤就可以了
所以现在脚本必须将用户名复制到同一文件夹中的新临时文件,例如。 users.txt
我该怎么做?
答案 0 :(得分:1)
试试这个:
for /f "tokens=2" %%a in ('findstr /r "USER.*331" *.log') do echo %%a>>users.txt
答案 1 :(得分:1)
我将以此日志文件为例
<强>日志\访问log.log 强>
USER jmacro
331 Password required for jmacro
PASS
230-Checking disk usage, please wait.
230-
230- Your disk quota is: 5.00 megabytes.
230- Your disk usage is:
230- Home/WWW: 1.23 megabytes
230- FTP: 0.00 megabytes
230- Total: 1.23 megabytes (25% of quota)
230-
230 User jmacro@macromedia.com logged in.
SYST
215 UNIX Type: L8 Version: BSD-198911
PWD
257 "/jmacro" is current directory.
USER nano
331 Password required for jmacro
PASS
230-Checking disk usage, please wait.
230-
230- Your disk quota is: 5.00 megabytes.
230- Your disk usage is:
230- Home/WWW: 1.23 megabytes
230- FTP: 0.00 megabytes
230- Total: 1.23 megabytes (25% of quota)
230-
230 User nano@macromedia.com logged in.
SYST
215 UNIX Type: L8 Version: BSD-198911
PWD
257 "/nano" is current directory.
这应该过滤用户名:
修改强>
现在脚本会删除重复项
<强> filter.bat 强>
@echo off
:: Filter user names
for %%f in (logs\*.log) do (
type "%%f" | find "USER" >> _temp.txt
)
if exist _temp.txt goto getUser
echo/No users or logs found&pause>nul&exit
:getUser
if not exist users.txt cd 1>nul 2>users.txt
for /f "tokens=2" %%u in ('type _temp.txt') do (
call:makefile %%u
)
del _temp.txt&exit
:makefile
type users.txt | find /i "%~1" >nul && goto already
echo/%~1 >> users.txt
:already
exit/b
答案 2 :(得分:1)
这个版本将删除重复的用户并留下每个用户的一个实例:
@echo off
(for /f "tokens=1*" %%a in ('findstr "USER" *.log') do echo %%b) >temp.tmp
sort <temp.tmp|uniq >users.txt
del temp.tmp
将其保存为uniq.bat
并将其放在与批处理文件相同的文件夹中或路径中的目录中:
@if (@CodeSection == @Batch) @then
@CScript //nologo //E:JScript "%~F0" & goto :EOF & Rem aacini 2013
@end
var line, prevLine = "";
while ( ! WScript.Stdin.AtEndOfStream ) {
line = WScript.Stdin.ReadLine();
if ( line != prevLine ) {
WScript.Stdout.WriteLine(line);
prevLine = line;
}
}
答案 3 :(得分:0)
已编辑 - 已将重定向添加到最终文件
EDITED 2 - 最后,删除了重复项。没有足够的日志文件来捕获它。
@echo off
setlocal enableextensions disabledelayedexpansion
set "user="
(for /f "tokens=2" %%a in (
'find "USER" "*.log" ^| findstr /r "^USER" ^| sort'
) do (
setlocal enabledelayedexpansion
if not "%%a"=="!user!" echo(%%a
endlocal
set "user=%%a"
)) > "users.txt"
endlocal