我想从一堆日志文件中提取信息,更具体地说,只从日志文件每行的第2和第3项中提取信息,以便写入新文件。
问题还在于,每个日志文件中都复制了许多这些条目,因此我不想将重复的标记/条目写入我正在写入的新文件中。
基本上它是一堆包含登录信息的日志文件 - IP和用户名位于日志文件中每行的第2和第3个位置。所以我只想提取一次这个信息,因为用户多次登录,并将每个唯一的IP和用户名写入新的单个日志文件。
我有以下内容:
for /f "tokens=2,3" in 'FTP_logs\*.log' >> ftp_ips.txt
然而,这不起作用。
由于
答案 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
完成的。