从日志文件中过滤特定文本

从日志文件中过滤特定文本

所以我有一个来自 Twitch 聊天的日志文件,我想制作一个词云,为此我只想要他们名字后面的文本,例如。

[Jun 01 2015 02:23:58 UTC] swimsphinx: test1
[Jun 01 2015 02:24:15 UTC] swimsphinx: test2
[Jun 01 2015 02:27:36 UTC] swimsphinx: lol

我想处理整个文件,以便删除日期和名称,所以只剩下 3 行

test1
test2
lol

这在 Windows CMD 中可行吗?或者我应该做其他什么?

答案1

(编辑:只是为了清楚起见,正如 David 所指出的,这在通用 Windows 解释器中不起作用cmd。这更像是一个 powershell 单行命令)

你可以做这样的事情:

cat chat.log | %{$_ -replace "\[[^]]*\] +[^ ]*: ",""} > words.txt

翻译:读取的内容chat.log,然后将其放入命令中以替换每行前面的任何看起来像时间戳/用户名的东西,并将结果放入words.txt

我也猜测,对于以下奇怪的情况:

[Jun 01 2015 02:24:15 UTC] swimsphinx: test2 [Jun 01 2015 02:24:15 UTC] swimsphinx: message

你想得到

test2 message

而不是

test2 [Jun 01 2015 02:24:15 UTC] swimsphinx: message

答案2

如同大卫·波斯蒂尔的答案,但您可以使用通配符删除子字符串之前的所有内容。

@echo off

setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (%1) do (
    set line=%%a
    echo !line:*swimsphinx: =!
)
endlocal

调用脚本时将文本文件的名称传递到脚本中(或将 %1 替换为您的文本文件名)。

答案3

如何从日志文件中过滤特定文本?

[2015 年 6 月 1 日 02:23:58 UTC] swimsphinx: test1
[2015 年 6 月 1 日 02:24:15 UTC] swimsphinx: test2
[2015 年 6 月 1 日 02:27:36 UTC] swimsphinx: 哈哈

如果行始终采用相同的格式,则可以使用以下批处理文件。

测试.cmd:

echo off
Setlocal EnableDelayedExpansion
for /f "tokens=4 delims=:" %%a in (log.txt) do (
  set _txt=%%a
  echo !_txt:~1! >> filtered.txt
  )

输入:

C:\test>type log.txt
[Jun 01 2015 02:23:58 UTC] swimsphinx: test1 abc
[Jun 01 2015 02:24:15 UTC] swimsphinx: test2
[Jun 01 2015 02:27:36 UTC] swimsphinx: lol

C:\test>

输出:

C:\test>type filtered.txt
test1 abc
test2
lol

C:\test>

笔记:

  • 使用输入文件log.txt和输出文件进行硬编码filtered.txt,您可以将这些名称作为参数传递到批处理文件中。
  • 使用您提供的格式,当分隔符为冒号 ( ) 时,要提取的文本是第 4 个标记:
  • set _txt=%%a随后!_txt:~1!用于删除第 4 个 后面的空格:

答案4

不是一个 cmd 解决方案并且喜欢 Powershell,但这实际上是 vim 的强项之一。

%s/.*:_ 

您就完成了。

_ 为空格字符

相关内容