批处理文件,用于在FTP日志文件中搜索FTP用户,并将其复制到另一个文件

时间:2014-01-23 11:01:57

标签: string batch-file replace

美好的一天。

我有一堆FTP日志。现在我想知道哪些用户在给定的时间范围内使用FTP。现在我将该时间范围内的一堆日志文件复制到一个文件夹中,因此我希望有一个批处理脚本执行以下操作:通过文件夹中的所有日志文件,并搜索以下术语,这些术语是唯一的日志文件中列出的所有用户:

USER stblma 331

其中 stblma 是用户。所以'USER'和'331'将成为日志上所有登录的标准,但仅在USER上过滤就可以了

所以现在脚本必须将用户名复制到同一文件夹中的新临时文件,例如。 users.txt

我该怎么做?

4 个答案:

答案 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