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ć?


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


@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).


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 :.

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


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ą

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.