Mogę użyć polecenia „skrypt”, aby nagrać sesję interaktywną w wierszu polecenia. Obejmuje to jednak wszystkie znaki kontrolne i kody kolorów. Mogę usunąć znaki kontrolne (np. Backspace) za pomocą „col -b”, ale nie mogę znaleźć prostego sposobu na usunięcie kodów kolorów.
Zauważ, że chcę używać wiersza poleceń w normalny sposób, więc nie chcę tam wyłączać kolorów - chcę tylko usunąć je z wyników skryptu. Wiem też, że mogę się pobawić i spróbować znaleźć wyrażenie regularne, aby to naprawić, ale mam nadzieję, że istnieje prostsze (i bardziej niezawodne - co, jeśli istnieje kod, o którym nie wiem, kiedy opracowuję wyrażenie regularne?).
Aby pokazać problem:
spl62 tmp: skrypt Skrypt uruchomiony, plik jest maszynopisem spl62 lepl: ls add-licence.sed build-example.sh commit-test push-docs.sh add-licence.sh build.sh delete-licence.sed setup.py asn build-test.sh delete-licence.sh src build-doc.sh clean doc-src test.ini spl62 lepl: exit Skrypt wykonany, plik jest maszynopisem spl62 tmp: cat -v maszynopis Skrypt został uruchomiony w czwartek 09 czerwca 2011 09:47:27 AM CLT spl62 lepl: ls ^ M ^ [[0m ^ [[00madd-licence.sed ^ [[0m ^ [[00; 32mbuild-example.sh ^ [[0m ^ [[00m test komendowy ^ [[0m ^ [[00; 32mpush-docs.sh] ^ [[0m ^ M ^ [[00; 32madd-licence.sh ^ [[0m ^ [[00; 32mbuild.sh ^ [[0m ^ [[00mdelete-licence.sed ^] [[0m ^ [[00msetup.py ^ [[0m ^ M ^ [[01; 34masn ^ [[0m ^ [[00; 32mbuild-test.sh ^ [[0m ^ [[00; 32mdelete-licence.sh ^] [[0m ^ [[01; 34msrc ^ [[0m ^ M ^ [[00; 32mbuild-doc.sh ^ [[0m ^ [[00; 32mclean ^ [[0m ^ [[01; 34mdoc-src ^] [[0m ^ [[00mtest.ini ^ [[0m ^ M spl62 lepl: exit ^ M Skrypt wykonany w czwartek 09 czerwca 2011 09:47:29 AM CLT spl62 tmp: col -b <maszynopis Skrypt został uruchomiony w czwartek 09 czerwca 2011 09:47:27 AM CLT spl62 lepl: ls 0m00madd-licence.sed0m 00; 32mbuild-example.sh0m 00m commit-test0m 00; 32mpush-docs.sh0m 00; 32madd-licence.sh0m 00; 32mbuild.sh0m 00mdelete-licence.sed0m 00msetup.py0m 01; 34masn0m 00; 32mbuild-test.sh0m 00; 32mdelete-licence.sh0m 01; 34msrc0m 00; 32mbuild-doc.sh0m 00; 32mclean0m 01; 34mdoc-src0m 00mtest.ini0m spl62 lepl: exit Skrypt wykonany w czwartek 09 czerwca 2011 09:47:29 AM CLT
źródło
Aktualizacja odpowiedzi Gillesa, aby usunąć również znaki powrotu karetki i wyczyścić poprzednie znaki, które były dla mnie ważne dla maszynopisu wygenerowanego w Cygwin:
źródło
Chciałbym użyć
sed
w tym przypadku.zrobić:
cat -v typescript | sed -e "s/\x1b\[.\{1,5\}m//g"
sed -e "s / search / replace / g" jest standardową rzeczą. Wyrażenie regularne jest wyjaśnione jak poniżej:
\x1b
dopasowanie Escape poprzedzające kod koloru\[
odpowiada pierwszemu otwartemu nawiasowi.\{1,5\}
odpowiada od 1 do 5 dowolnego pojedynczego znaku. Muszą\
kręcone szelki, aby powstrzymać muszlę przed nimi.m
ostatni znak w wyrażeniu regularnym - zwykle śledzi kod koloru.//
pusty ciąg znaków na co zastąpić wszystko.g
dopasuj to wiele razy w linii.źródło
foo\e[1m(1m = {
staje sięfoo = {
zamiastfoo(m = {
), zastępowanie.
przez[0-9;]
jest bardziej dokładne..\{1,5\}
z[^m]\{1,5\}
tego - ale również pamiętać, że nawet wtedy jeszcze tylko usuwa „grafika wydania” kody (te, które kończą sięm
) - w zasadzie kolorów, do tyłu, pogrubienie i kursywa Styl (o ile dotyczy).\x1b(B
(zawarte w wydruku koloru rdzy)\x1b
a nie\033
?\u001b
zamiast\x1b
źródło
=> jak korzystać:
testowane na: - AIX 5.x / 6.1 / 7.1 - Linux Mandrake / Mandriva / SLES / Fedora - SunOS
źródło
Rozwiązałem problem, uruchamiając
scriptreplay
ekran i zrzucając bufor przewijania do pliku.Poniższy skrypt oczekiwań robi to za Ciebie.
Został przetestowany dla plików logów zawierających do 250 000 linii. W katalogu roboczym potrzebujesz swojego dziennika skryptów, pliku o nazwie „czas” z 10.000.000 razy większą niż linia „1 10” oraz skryptu. Potrzebuję nazwę twojego pliku skryptu jako argument wiersza poleceń, jak
./name_of_script name_of_scriptlog
.Plik czasu może zostać wygenerowany przez
źródło
delay
blocksize
”, więc nie ma powodu, aby po prostu nie „0
<entirefile>
” i zrzucić wszystkiego bez zwłoki. Możesz to zrobić, biorąc rozmiar skryptu minus pierwszy wiersz (tail -n +2 typescript|wc -c
) i utwórz plik pomiaru czasu za pomocąecho "0 "`tail -n +2 typescript|wc -c` > timing
. Będzie to w zasadzie natychmiastowe iscriptreplay
odtworzy cały skrypt z największą możliwą prędkością.Znalazłem to pytanie, szukając rozwiązania tego samego problemu. Trochę więcej kopie i znalazłem ten skrypt w Live Journal pod tym linkiem. Pracowałem dla siebie idealnie. Jest to również bardzo dobry opis tego problemu i działania rozwiązania. Zdecydowanie warte przeczytania. http://jdimpson.livejournal.com/7040.html
źródło
Wolałbym używać specjalistycznych narzędzi do konwersji danych wyjściowych skryptu na zwykły tekst, który jest stale obsługiwany i dobrze testowany, zamiast niestandardowych wyrażeń regularnych. To dla mnie zadziałało:
polecenie skryptu jest przechwytywane do pliku maszynopisu ansi2txt - konwertuje kod ansi ze znakami zmiany znaczenia, takimi jak kody kolorów, spacje itp., na zwykły tekst, jednak zauważyłem, że kilka znaków ucieczki wciąż pozostaje. col -bp - całkowicie je usunął.
Przetestowałem to na najnowszej dyskotece Ubuntu i działa.
źródło
W pakiecie na Ubuntu znajduje się
ansi2txt
poleceniecolorized-logs
. Ładnie usuwa kody kolorów ANSI, ale nie radzi sobie z takimi rzeczami, jak paski postępu wytwarzane przez emitowanie^H
lub^M
znaki zastępujące tekst w miejscu.col -b
poradzi sobie z nimi , więc dla uzyskania najlepszych rezultatów możesz połączyć obaźródło
Przekonałem się, że wystarczyło użyć
cat
, by zobaczyć dane wyjściowescript
w terminalu. To nie pomaga, gdy przekierowanie wyjścia do innego pliku, ale nie sprawiają, że wynik czytelny, w przeciwieństwie docat -v
,col -b
lub edytora tekstu.Aby wyeliminować kolory lub zapisać wyniki w pliku, ręcznie skopiuj i wklej dane wyjściowe z
cat
edytora tekstu lub do innegocat
polecenia, np .:źródło
script
bieg zawiera dane wyjściowe z dołączonymi kodami kolorów, jak w przypadku PO?cat
prezentuje oryginalne kolory, które można usunąć ręcznie kopiując i wklejając. Wykorzystany OPcat -v
icol -b
oba przedstawiają kody zamiast poprawnie sformatowanego wyniku końcowego. Zredagowałem swoją odpowiedź.W odpowiedzi na ostatnią odpowiedź, która używa tr i: cntrl: moglibyśmy zrobić
sed "/^[[:cntrl:]]/d" output.txt
Wydaje mi się, że to działa, ponieważ wszystkie linie generowane przez vi zaczynają się od znaku kontrolnego. Zdarza się również, że usuwam puste linie i linie zaczynające się od tabulatora, chociaż to działa w przypadku tego, co robię. Może istnieje sposób na dopasowanie dowolnego znaku kontrolnego oprócz \ n \ m \ t.
Może możemy wyszukać konkretną postać kontrolną i wygląda na to, że wszystkie niepotrzebne linie generowane przez vi zaczynają się od czegoś, co wygląda jak ^ [. hexdump mówi mi, że pierwsza postać to 1b, więc wydaje się, że to też działa
sed "/^\x1b/d" output.txt
Wygląda to podobnie do odpowiedzi zamieszczonej powyżej, ale nie działa poprawnie, ponieważ po uruchomieniu polecenia niektóre niepotrzebne znaki są już dodawane do wiersza poleceń, tak jakby użytkownik je wpisał.
źródło
ls --color
(jak pokazano w pytaniu), rozwiązanie usunie prawie każdy wiersz zawierający informacje. Niedobrze. Ale dzięki za pominięcie bezużytecznego użyciacat
. :-) tr
- tłumaczyć lub usuwać znakiźródło
01;34m
np. I usunie końca liniinewline (\n)
.