BatchScript循环遍历日志文件并将特定标记写入新文件

时间:2015-08-25 16:36:43

标签: batch-file

我想从一堆日志文件中提取信息,更具体地说,只从日志文件每行的第2和第3项中提取信息,以便写入新文件。

问题还在于,每个日志文件中都复制了许多这些条目,因此我不想将重复的标记/条目写入我正在写入的新文件中。

基本上它是一堆包含登录信息的日志文件 - IP和用户名位于日志文件中每行的第2和第3个位置。所以我只想提取一次这个信息,因为用户多次登录,并将每个唯一的IP和用户名写入新的单个日志文件。

我有以下内容:

for /f "tokens=2,3" in 'FTP_logs\*.log' >> ftp_ips.txt

然而,这不起作用。

由于

2 个答案:

答案 0 :(得分:1)

@echo off
setlocal

rem Process all .log files
(for %%f in (Ftp_logs\*.log) do (
   rem For each file, process tokens 2,3
   for /F "usebackq tokens=2,3" %%a in ("%%f") do (
      rem If this combination had not appeared before...
      if not defined comb[%%a-%%b] (
         rem Echo it and create the combination
         echo %%a %%b
         set "comb[%%a-%%b]=1"
      )
   )
)) > ftp_ips.txt

编辑回复评论

我的程序有一个小错误,现在已修复;然而...

当有任何"文件/路径未找到错误时#34;在解决方案中,由您来解决它们。您知道计算机中存在真实的路径/文件名,因此只需对代码进行简单调整即可使其运行。

你总是应该发布一个真实数据的例子,所以我们可以复制它并在我们的解决方案中使用它。如果您不发布任何数据,我们会根据您提供的信息提供解决方案。

根据您的描述,每个日志文件都有类似于这些的行:

token1 IPone USERone
token1 IPone USERtwo
token1 IPtwo USERone
token1 IPthree USERtwo

我准备了三个示例文件并运行我的解决方案(修复了错误)。以下是测试会话的输出:

C:\Users\Antonio\Documents\Test> dir
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: 0895-160E

 Directorio de C:\Users\Antonio\Documents\Test

26/08/2015  10:49 a. m.    <DIR>          .
26/08/2015  10:49 a. m.    <DIR>          ..
26/08/2015  10:33 a. m.    <DIR>          Ftp_logs
26/08/2015  10:44 a. m.               414 test.bat
               1 archivos            414 bytes
               3 dirs  421,700,231,168 bytes libres

C:\Users\Antonio\Documents\Test> dir Ftp_logs
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: 0895-160E

 Directorio de C:\Users\Antonio\Documents\Test\Ftp_logs

26/08/2015  10:33 a. m.    <DIR>          .
26/08/2015  10:33 a. m.    <DIR>          ..
26/08/2015  10:32 a. m.               204 One.log
26/08/2015  10:34 a. m.               216 Three.log
26/08/2015  10:33 a. m.               210 Two.log
               3 archivos            630 bytes
               2 dirs  421,700,231,168 bytes libres

C:\Users\Antonio\Documents\Test> type Ftp_logs\One.log
token1 IPone USERone
token1 IPone USERtwo
token1 IPone USERthree
token1 IPtwo USERone
token1 IPtwo USERtwo
token1 IPtwo USERthree
token1 IPone USERone
token1 IPone USERtwo
token1 IPone USERthree

C:\Users\Antonio\Documents\Test> type Ftp_logs\Two.log
token1 IPtwo USERone
token1 IPtwo USERtwo
token1 IPtwo USERthree
token1 IPthree USERone
token1 IPthree USERtwo
token1 IPthree USERthree
token1 IPtwo USERone
token1 IPtwo USERtwo
token1 IPtwo USERthree

C:\Users\Antonio\Documents\Test> type Ftp_logs\Three.log
token1 IPone USERone
token1 IPone USERtwo
token1 IPone USERthree
token1 IPthree USERone
token1 IPthree USERtwo
token1 IPthree USERthree
token1 IPthree USERone
token1 IPthree USERtwo
token1 IPthree USERthree

C:\Users\Antonio\Documents\Test> test

C:\Users\Antonio\Documents\Test> type ftp_ips.txt
IPone USERone
IPone USERtwo
IPone USERthree
IPtwo USERone
IPtwo USERtwo
IPtwo USERthree
IPthree USERone
IPthree USERtwo
IPthree USERthree

非常重要:在此处发布任何进一步评论之前,您必须复制我在测试中使用的数据并使用运行程序相同的数据。之后,如果程序仍然没有使用您的实际数据,您必须比较两个数据以找出差异并在下一条评论中发布此信息(如果有的话)。

最后,你永远不应仅仅因为&#34;它不起作用而拒绝任何答案,特别是如果你没有提供任何有助于解决问题的反馈。请记住,您正在请求我们的帮助,我们是免费提供的......

答案 1 :(得分:-1)

for /f无法将“FTP_logs”识别为文件夹,而是for没有表格。<
要实现这一点,请将整个for /f包含在for循环中。

for %%a in (Ftp_logs\*.log) do (
    for /f "tokens=2,3" %%b in (%%a) do (echo %%b %%c >> ftp_ips.txt)
)

此外,批量重定向是使用echo SOMETHING >> file.txt完成的。