Usuwanie znaków zmiany znaczenia z logu ekranowego GNU Screen.% N

14

Czy można usunąć sekwencje ESC z pliku wyjściowego GNU Screen? Elementy, takie jak kolory, tabulatory i inne znaki specjalne, przedostają się do plików dziennika i stają się trudne do odczytania.

Próbowałem Dr. Google & Co., a także czytałem instrukcję, ale nie znalazłem nic odpowiedniego ...

Być może coś przeoczyłem?

Shaond
źródło

Odpowiedzi:

11

Wypróbuj ten kawałek magii Perla:

perl -ne 's/\x1b[[()=][;?0-9]*[0-9A-Za-z]?//g;s/\r//g;s/\007//g;print' < screenlog.0
Whitequark
źródło
Dzięki za to - to NIESAMOWITE! Wciąż ma tam znaki ^ G i ^ M, ale jest o wiele bardziej czytelny ...
shaond
1
Dodano to do wyrażenia.
whitequark
Zastanawiam się, ile twarzy ASCII znajduje się w tej jednej linijce. Przestałem liczyć około 20.
John T
4
Oczywiście mogę napisać kolejną linijkę, która je policzy.
whitequark
10

Użyj filtra.

ansifilter screenlog.txt > screenlog.txt.clean
Jan
źródło
czy jest to coś w każdym systemie Linux, czy coś, co trzeba zainstalować?
Journeyman Geek
@JourneymanGeek nie ma go nawet w repozytoriach Ubuntu, więc powiedziałbym, że nie jest zbyt popularny. Wygląda na to, że musisz pobrać go sam ze strony projektu i samodzielnie uruchomić / skompilować. Nie nazwałby tego popularnym programem ansifilter.sourceforge.net
Simon Sheehan
Używam OSX i używałem brew install ansifiltergo i działało to jak urok.
thekingoftruth
1
Nie wiem, jak to się zmieniło od komentarzy z 2012 roku na temat dystrybucji, ale znalazłem to w repozytorium dla bieżącej wersji Fedory (22).
dmh
10

Wypróbuj również opcję -r lub -R opcji less.

less -r screenlog.0
dex
źródło
Niezłe rozwiązanie. Prawidłowo radzi sobie ze wszystkimi znakami ^ H (usuń), wyświetla paski postępu bez crufta ^ M, a nawet zachowuje mój monit koloru! Oczywiście czasami wyświetlanie dziennika nie jest wystarczające.
Quantum7
5

Po przechwyceniu sesji w screenlog.n, możesz cat plik do terminalu, a następnie użyć polecenia hardcopy screen, aby zrzucić dane wyjściowe kota do pliku. Rezultat zapewni czyste wyjście, które nie ma żadnych sekwencji specjalnych.

Jedynym „gotcha” wydaje się być upewnienie się, że wydruk przechwytuje wszystko w buforze przewijania i że bufor przewijania zawiera tylko to, co chcesz przechwycić.

1. $ screen
2. $ cd /path/to/screenlog.n directory/
3. $ wc -l screenlog.n 
4. $ screen -X scrollback 245 # 245 is the number of lines found from your wc command + 5 
5. $ cat screenlog.n
6. $ screen -X hardcopy -h screenlog.n.cleaned 

Zauważ, że -h zapewnia przechwycenie całej historii przewijania, a nie tylko tego, co jest widoczne w bezpośrednim widoku

Plik screenlog.n.cleaned będzie teraz zawierał wydruk wyjścia kota i nie będzie zawierał żadnych sekwencji specjalnych

Joel Verks
źródło
Bardzo bardzo schludnie . Wszystkie inne perl / sed / python one-liner zawiodły dla mnie. Bardzo frustrujące, gdy pomyślałem, że mniej -r / więcej zajmują się moim plikiem bezpośrednio. Jedna sugestia wc -lnie działała dla mnie. Zwrócił 28226, ale naprawdę potrzebował 33031 w moim przypadku.
Malat
4

Używam tego stringspolecenia, aby dziennik ekranu był czytelny. Pod Debianem jest częścią pakietu binutils.

Jak mówi strona man:

ciągi - znajdź ciągi do wydrukowania w obiekcie lub innym pliku binarnym

blasio
źródło
2

Jeśli jesteś screenużytkownikiem, rozwiązanie w postaci papierowej kopii zaproponowane przez post Joela Verksa będzie działało najlepiej - zakładając, że masz duże przewijanie zdefiniowane w .screenrc:

defscrollback 10000

wtedy zrobiłbyś:

  1. Wyświetl swój screenlogplik:

    $ cat screenlog.<screen_window_num>
    
  2. Użyj hardcopy -h(patrz strona podręcznika ekranowego), aby zapisać bieżącą zawartość okna i bufor przewijania do hardcopy.#pliku:

    <Escape key> (Ctrl-a by default)
    :hardcopy -h
    
Steve McKuhr
źródło