Filtrando texto específico do arquivo de log

5

Então eu tenho um arquivo de log do chat do Twitch e eu quero fazer uma nuvem de palavras, para fazer isso eu só quero os textos após o seu nome, por exemplo.

[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

Eu quero processar o arquivo inteiro para que a data e o nome sejam removidos, então deixo 3 linhas

test1
test2
lol

Isso é possível no Windows CMD? Ou há algo mais que devo fazer?

    
por friend man 16.06.2015 / 07:50

5 respostas

6

(EDIT: Apenas para clareza, como observado por David, isso não vai funcionar no interpretador genérico cmd . Este é mais um one-liner powershell)

Você poderia fazer algo assim:

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

Traduzido: leia o conteúdo de chat.log , em seguida insira isso em um comando para substituir qualquer coisa que se pareça com um timestamp / username na frente de cada linha e coloque o resultado em words.txt

Eu também adivinhei, para casos estranhos como:

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

você deseja obter

test2 message

em vez de

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

    
por 16.06.2015 / 08:40
1

Semelhante a resposta de DavidPostill , mas você pode usar um curinga para remover tudo antes de uma substring.

@echo off

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

Transmita o nome do arquivo de texto para o script ao chamá-lo (ou substitua% 1 pelo seu nome de arquivo de texto).

    
por 16.06.2015 / 15:11
1

Como posso filtrar um texto específico de um arquivo de log?

[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

Se as linhas estiverem sempre no mesmo formato, você poderá usar o seguinte arquivo em lotes.

test.cmd:

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

entrada:

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>

saída:

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

C:\test>

notas:

  • codificado com o arquivo de entrada log.txt e o arquivo de saída filtered.txt , você poderia passar esses nomes para o arquivo em lote como parâmetros.
  • com o formato fornecido, o texto que você deseja extrair é o quarto token quando o delimitador for dois pontos ( : ).
  • set _txt=%%a seguido por !_txt:~1! é usado para remover o espaço após o quarto : .
por 16.06.2015 / 08:38
0

Aí vem minha escolha pessoal usando PythonPy . Funciona em vários sistemas operacionais e você pode reutilizar seu conhecimento em Python. Mesmo que você não conheça o aprendizado do Python, seria mais fácil do que gastar tempo com o Awk & Sedimentos.

Veja como você precisa começar.

  1. Instale o PythonPy para windows

    pip install pythonwpy

  2. Use este comando type test | wpy -x 'print(x.split(" ")[-1])' para analisar seu arquivo de log.

Aqui está o que eu tentei e consegui:

nehemiah@neo ~> type test.txt
[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
nehemiah@neo ~> type test.txt | wpy -x 'x.split(" ")[-1]'
test1
test2
lol

3. Você pode aprender muito mais recursos interessantes para o Windows aqui e para o Linux / OSX aqui

    
por 16.06.2015 / 09:08
0

Não é uma solução cmd e ama o Powershell, mas este é realmente um dos pontos strongs do vim.

%s/.*:_ 

e pronto.

_ sendo o caractere de espaço

    
por 16.06.2015 / 12:33