Filtrowanie określonego tekstu z pliku dziennika

5

Mam więc plik dziennika z czatu Twitcha i chcę stworzyć chmurę słów, aby to zrobić, chcę tylko teksty po ich nazwie, np.

[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

Chcę przetworzyć cały plik, aby data i nazwa zostały usunięte, więc zostały mi 3 linie

test1
test2
lol

Czy jest to możliwe w Windows CMD? Czy jest coś jeszcze, co powinienem zrobić?

przyjacielu człowieku
źródło
Czy mógłbyś uruchomić PowerShell zamiast CMD?
tanantish
pewnie, cokolwiek
przyjaciel człowiek
Możesz to zrobić w dowolnym języku programowania z
funkcją

Odpowiedzi:

6

(EDYCJA: Dla jasności, jak zauważył David, nie zadziała to w ogólnym cmdinterpretatorze systemu Windows . To bardziej jednolinijka PowerShell)

Możesz zrobić coś takiego:

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

Przetłumaczone: przeczytaj treść chat.log, a następnie potokuj to w poleceniu, aby zamienić wszystko, co wygląda jak znacznik czasu / nazwa użytkownika na początku każdej linii, i umieść wynik wwords.txt

Zgadłem też, że w dziwnych przypadkach, takich jak:

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

chcesz dostać

test2 message

zamiast

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

tanantish
źródło
@friendman „Czy jest to możliwe w Windows CMD?” - Proszę podzielić się, jak to działa w cmd ... to wygląda jak bash (lub cywin) rozwiązanie, które nie jest tym, o co prosiłeś.
DavidPostill
@DavidPostill Zapytałem w komentarzach, czy PowerShell jest opcją (i najwyraźniej tak jest), a pytanie brzmi: „Czy jest to możliwe w Windows CMD? Czy jest coś jeszcze, co powinienem zrobić?”
tanantish
@DavidPostill Również dla jasności dodałem edycję do mojej odpowiedzi, aby było jasne, że nie idę po cmdrozwiązanie. To rozwiązanie typu PowerShell
tanantish
Słusznie. Nie było dla mnie oczywiste, że był to powershellskrypt :(
DavidPostill
@DavidPostill Muszę przyznać, że jest dość zwięzły, * składnia podobna do NIX (i wyrażenia regularne nigdy nie są aż tak ładne), ale znalazłem zaskakująco przydatny wzorzec do rzucania takich rzeczy.
tanantish
1

Podobne do odpowiedzi DavidPostill , ale możesz użyć symbolu wieloznacznego, aby usunąć wszystko przed podciągiem.

@echo off

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

Przekaż nazwę pliku tekstowego do skryptu, gdy go wywołujesz (lub zastąp% 1 nazwą pliku tekstowego).

jon_two
źródło
1

Jak filtrować określony tekst z pliku dziennika?

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

Jeśli wiersze są zawsze w tym samym formacie, możesz użyć następującego pliku wsadowego.

test.cmd:

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

Wejście:

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>

wynik:

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

C:\test>

uwagi:

  • zapisane na stałe w pliku wejściowym log.txti wyjściowym filtered.txt, można przekazać te nazwy do pliku wsadowego jako parametry.
  • w podanym formacie tekst, który chcesz wyodrębnić, jest czwartym tokenem, gdy ogranicznikiem jest dwukropek ( :).
  • set _txt=%%aa następnie !_txt:~1!służy do usuwania miejsca po czwartym :.
DavidPostill
źródło
0

Oto mój osobisty wybór za pomocą PythonPy . Działa w wielu systemach operacyjnych i możesz ponownie wykorzystać swoją znajomość języka Python. Nawet jeśli nie znasz nauki języka Python, byłoby to łatwiejsze niż spędzanie czasu z materiałami Awk & Sed.

Oto jak zacząć.

  1. Zainstaluj PythonPy dla Windows

    pip install pythonwpy

  2. Użyj tego polecenia, type test | wpy -x 'print(x.split(" ")[-1])'aby przeanalizować plik dziennika.

Oto, co próbowałem i otrzymałem:

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. Możesz dowiedzieć się o wiele więcej ekscytujących funkcji dla systemu Windows tutaj i dla systemu Linux / OSX tutaj

nehemiasz
źródło
0

Nie jest to rozwiązanie cmd i uwielbiam PowerShell, ale w rzeczywistości jest to jedna z zalet Vima.

%s/.*:_ 

i jesteś skończony.

_ będąc spacją

Lieven Keersmaekers
źródło