所以我有一个来自 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/.*:_
您就完成了。
_ 为空格字符