Korzystam z linuksowego polecenia „skrypt” http://www.linuxcommand.org/man_pages/script1.html do śledzenia niektórych interaktywnych sesji. Pliki wyjściowe z tego zawierają znaki niedrukowalne, w tym moje naciśnięcia klawiszy z backspace.
Czy istnieje sposób na uporządkowanie tych plików wyjściowych, aby zawierały tylko to, co było wyświetlane na ekranie?
A może istnieje inny sposób rejestrowania interaktywnej sesji powłoki (wejście i wyjście)?
Odpowiedzi:
Jeśli chcesz wyświetlić plik, możesz wysłać dane wyjściowe przez
col -bp
; interpretuje to znaki kontrolne. Następnie możesz przepuścić mniej, jeśli chcesz.W niektórych systemach
col
nie akceptuje argumentu nazwy pliku, zamiast tego użyj tej składni:źródło
col
nie zaakceptuje nazwy pliku, więc zrobiłem tocol -bp < typescript
i dostałem to, czego chciałem.less -R
Sam w moim systemie zapewnia lepszą wydajność niż przepuszczanie przezcol -bp
pierwszy.col -bp <typescript | less -R
nie wyświetla pokolorowanej konsoli. Użycieless -R typescript
wyświetla kolorową konsolę!less
.oto interpretacja ciągu znaków wejściowego do
perl
:s/pattern//g
oznacza wykonanie podstawienia dla całego (g
opcja oznacza zrobienie wszystkiego zamiast zatrzymywania się na pierwszym zastępstwie)oto interpretacja wzorca wyrażenia regularnego:
\e
dopasuj specjalny znak kontrolny „escape” (ASCII 0x1A)(
i)
są początkiem i końcem grupy|
oznacza, że grupa może dopasować jeden z N wzorów. gdzie są wzorce N.[^\[\]]
lub\[.*?[a-zA-Z]
lub\].*?\a
[^\[\]]
znaczy[
i]
\[.*?[a-zA-Z]
znaczy[
następnie zrób non-zachłanny.*?
aż do pierwszego znaku alfa\].*?\a
znaczy]
a następnie rób non-zachłanny,.*?
dopóki nie trafisz specjalnego znaku kontrolnego o nazwie „znak alarmu (dzwonek)”źródło
typescript
zperl
programu, który usuwa pewne znaki sterujące z wyjścia, a następnie rury wyjście do uniksowegocol
polecenia, którego-b
opcja usuwa wszystkie „Usuń” kluczowe artefakty w transkryptu. Następnie przesyła dane wyjściowe do pliku tekstowego.Dla dużej ilości
script
wyników zhakowałbym iteracyjnie skrypt perla. W przeciwnym razie edytuj ręcznie za pomocą dobrego edytora.Jest mało prawdopodobne, aby istniała zautomatyzowana metoda usuwania znaków kontrolnych z
script
danych wyjściowych w sposób, który odtwarza to, co było wyświetlane na ekranie w pewnych ważnych momentach (na przykład, gdy host czekał na pierwszy znak wprowadzony przez użytkownika).Na przykład ekran może być pusty, z wyjątkiem tego
Andrew $
, że jeśli następnie wpiszeszrm /*
i naciśniesz backspace dwanaście razy (znacznie więcej niż to konieczne), to, co zostanie wyświetlone na ekranie, zależy od tego, która powłoka była uruchomiona, jakie są twoje obecnestty
ustawienia ( które możesz zmienić w trakcie sesji) i prawdopodobnie także inne czynniki.Powyższe dotyczy każdej zautomatyzowanej metody ciągłego przechwytywania danych wejściowych i wyjściowych. Główną alternatywą jest robienie „zrzutów ekranu” lub wycinanie i wklejanie ekranu w odpowiednim czasie podczas sesji (to jest to, co robię dla instrukcji użytkownika, notatek z dziennego dziennika itp.).
źródło
Odpowiedzią na drugą część mojego pytania jest skorzystanie z funkcji logowania na ekranie GNU:
^A H
z poziomu sesji uruchomionego ekranu. Dokumentacja znajduje się na stronie http://www.gnu.org/software/screen/manual/screen.html#Loggingźródło
Użyłem,
cat filename
który usuwa znaki kontrolne :-)źródło
Jeśli chcesz nagrać swoje polecenia (np. Aby później przekształcić je w skrypt bash), to rozsądnym włamaniem jest uruchomienie
script(1)
, a następnie uruchomienie goNastępnie
grep
plik wyjściowy (zwykle „maszynopis”) szuka linii zaczynających się od „+”. Wyrażenie regularne załatwi^\+
sprawę.źródło
Jeśli chcesz zapisać dane wyjściowe w pliku:
w razie potrzeby użyj komendy unix2dos, aby przekonwertować plik do formatu Windows
źródło
col -bp przetwarza backspace zgodnie z potrzebami (AFAIK). Ale zmienia sekwencje ucieczki kolorów. Dobrze jest najpierw usunąć sekwencje kolorów, a następnie, jeśli to możliwe, przetworzyć odstępy.
Jest to bardzo powszechna potrzeba i jestem zaskoczony, że nie ma już więcej rozwiązań. Skryptowanie sesji jest niezwykle powszechne, wtedy ktoś musi przejrzeć procedurę. Chcesz wyciąć wszystkie małe błędy pisarskie i sekwencje specjalne kolorów, aby utworzyć „czysty” skrypt procedury do wykorzystania w przyszłości. Preferowany prosty tekst ASCII. Myślę, że właśnie to jest zamierzone przez „czytelne dla człowieka” i jest to bardzo rozsądne.
źródło
Znalazłem odpowiedź udzieloną przez dewtall na podobne pytanie na tablicy Unixa, która jest bardziej skuteczna w usuwaniu znaków kontrolnych z wyników skryptu, jeśli jesteś w środowisku, w którym dostępny jest Perl.
skrypt dewtall:
Aby usunąć znaki kontrolne:
źródło
https://github.com/RadixSeven/typescript2txt został napisany w celu rozwiązania tego problemu.
Minęły 4 lata, odkąd ostatnio go zaktualizowałem / użyłem, ale nie pamiętam, żeby robić coś wymyślnego, co nie powinno dziś działać.
źródło
Znalazłem dobry sposób, aby to zrobić. W moim systemie długie linie wyjściowe są posypane „^ M” (puste miejsce, po którym następuje powrót karetki). „^ M” można ładnie zastąpić znakiem zerowym „^ @”, który w ogóle nie wyświetla się podczas przechwytywania pliku.
Przechwytuję też timing, więc aby idealnie odtworzyć plik, nie mogę po prostu całkowicie usunąć „^ M” za pomocą poniższych poleceń (ponieważ odtwarzanie skryptów liczy bajty):
Uruchamiam polecenie skryptowe w następujący sposób:
Później robię:
Pierwsza edycja (przed powtórzeniem) zachowuje liczbę bajtów w pliku. Druga edycja (po powtórce) usuwa białe miejsca w losowych miejscach. (Zauważ, że domyślnie scriptreplay szuka pliku wejściowego o nazwie „maszynopis”, dlatego nie dostarczyłem go po „timingu”).
źródło
dos2unix na wyjściu również załatwi sprawę
źródło
Innym rozwiązaniem jest użycie,
strings
które wypisuje tylko drukowalne znaki z pliku (lub ze standardowego wejścia):Ta
-n 1
opcja ustawia minimalną długość sekwencji do zachowania na jedną, a tym samym zapewnia zachowanie nawet pojedynczych znaków drukowalnych otoczonych znakami niedrukowalnymi.Jednym z możliwych wad tego podejścia jest to, że
strings
dodaje podziały linii między ciągłymi ciągami znaków do wydrukowania. Na przykład plik z zawartością(gdzie
<SOMECONTROLCHAR>
jest znak kontrolny lub dowolny inny znak niedrukowalny) zostanie zwrócony jakoInnym zagadnieniem poruszonym w komentarzach jest to, że niektóre sekwencje znaków kontrolnych składają się z kombinacji zarówno znaków drukowalnych, jak i niedrukowalnych, a takie podejście usunęłoby tylko część z nich.
Jednak
strings
dobrze sprawdza się w usuwaniu znaków kontrolnych, takich jak backspace wspomniany w pytaniu.źródło
strings
nie usuwa wszystkich znaków niedrukowalnych. Identyfikuje i drukuje sekwencje znaków do wydrukowania . To nie to samo.strings
drukowane są tylko sekwencje o minimalnej długości 4. Poprawiłem swoją odpowiedź, dodając-n 1
opcję, która ustawia minimalną długość na 1. Dziękujemy za zwrócenie na to uwagi.strings
usuwa wszystkie niedrukowalne znaki, więc nadal jest błędne w taki sam sposób, jak przed edycją. Jest również oczywiście zepsuty, ponieważ „niektóre kody kolorów” (i ogólnie kody kontrolne) często składają się zarówno ze znaków drukowalnych, jak i niedrukowalnych. Na przykład sekwencją kodu sterującego do zmiany koloru tekstu może być miejsce, wESC[01;52m
którymESC
znajduje się pojedynczy znak zmiany znaczenia (wartość bajtu 27). Użyciestrings
zgodnie z sugestią pozostawiłoby[01;52m
wynik, co nie ma znaczenia.strings
może nie wykonywać tej samej pracy, co niektóre inne odpowiedzi, ale IMHO to prawidłowe podejście do rozwiązania problemu opisanego w pytaniu.