it-swarm-id.com

Menghapus karakter kontrol (termasuk kode / warna konsol) dari output skrip

Saya dapat menggunakan perintah "skrip" untuk merekam sesi interaktif di baris perintah. Namun, ini termasuk semua karakter kontrol dan kode warna. Saya dapat menghapus karakter kontrol (seperti backspace) dengan "col -b", tetapi saya tidak dapat menemukan cara sederhana untuk menghapus kode warna.

Perhatikan bahwa saya ingin menggunakan baris perintah dengan cara biasa, jadi tidak ingin menonaktifkan warna di sana - Saya hanya ingin menghapusnya dari output skrip. Juga, saya tahu bisa bermain-main dan mencoba menemukan regexp untuk memperbaiki, tetapi saya berharap ada yang lebih sederhana (dan lebih dapat diandalkan - bagaimana jika ada kode yang saya tidak tahu ketika saya mengembangkan solusi regexp?).

Untuk menunjukkan masalah:

 spl62 tmp: script 
 Script dimulai, file adalah TypeScript 
 spl62 lepl: ls 
 add-licence.sed build-example.sh uji-coba 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: keluar 
 Script selesai, file adalah TypeScript 
 spl62 tmp: cat -v TypeScript 
 Script dimulai pada Kamis 09 Juni 2011 09:47:27 AM CLT 
 Spl62 lepl: ls ^ M 
 ^ [[0m ^ [[00madd-licence.sed ^ [[0m ^ [[00; 32mbuild-example.sh] ^ [[0m ^ [[00mcommit-test ^ [[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: keluar ^ M 
 
 Skrip dilakukan pada Kamis 09 Jun 2011 09:47:29 CLT 
 Spl62 tmp: col -b <TypeScript 
 Script dimulai pada Kamis 09 Jun 2011 09:47:27 AM CLT 
 Spl62 lepl: ls 
 0m00madd-licence.sed0m 00; 32mbuild-example.sh0m 00mcommit-test0m 00; 32mpush-docs.sh0m 
 00; 32madd-licence.sh0m 00; 32mbuild.sh0m 00mdelete-licence.sed0m 00mdelete .py0m 
 01; 34masn0m 00; 32mbuild-test.sh0m 00; 32mdelete-licence.sh0m 01; 34msrc0m 
 00; 32mbuild-doc.sh0m 00; 32mclean0m 01; 34mdoc-src0m 00mtest.ini 
 spl62 lepl: keluar 
 
 Skrip dilakukan pada Kamis 09 Jun 2011 09:47:29 pagi CLT 
71
andrew cooke

Skrip berikut harus memfilter semua urutan kontrol ANSI/VT100/xterm untuk (berdasarkan ctlseqs ). Diuji secara minimal, tolong laporkan setiap pertandingan yang kurang atau lebih cocok.

#!/usr/bin/env Perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \e\[ [ -?]* [@-~] | # CSI ... Cmd
       \e\] .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       \e[P^_] .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e. //xg;
    print;
}

Masalah Dikenal:

  • Tidak mengeluh tentang urutan yang salah. Bukan untuk apa skrip ini dibuat.
  • Argumen string multi-baris ke DCS/PM/APC/OSC tidak didukung.
  • Bytes dalam kisaran 128–159 dapat diuraikan sebagai karakter kontrol, meskipun ini jarang digunakan. Berikut adalah versi yang mem-parsing karakter kontrol non-ASCII (ini akan memotong-motong teks non-ASCII dalam beberapa penyandian termasuk UTF-8).
#!/usr/bin/env Perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
    print;
}

Memperbarui jawaban Gilles untuk juga menghapus carriage return dan melakukan backspace-delete karakter sebelumnya, yang sama pentingnya bagi saya untuk TypeScript yang dihasilkan di Cygwin:

#!/usr/bin/Perl
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \r | # Remove extra carriage returns also
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
       1 while s/[^\b][\b]//g;  # remove all non-backspace followed by backspace
    print;
}
31
dewtell

Saya akan menggunakan sed dalam kasus ini.

melakukan:

cat -v TypeScript | sed -e "s/\x1b\[.\{1,5\}m//g"

sed -e "s/search/replace/g" adalah hal standar. regex dijelaskan sebagai berikut:

\x1b cocok dengan Escape sebelum kode warna \[ cocok dengan braket terbuka pertama .\{1,5\} cocok dengan 1 hingga 5 karakter tunggal apa pun. Harus \ kurung kurawal untuk menjaga Shell agar tidak hancur. m karakter terakhir di regex - biasanya mengikuti kode warna. // string kosong untuk apa mengganti segalanya. g cocokkan beberapa kali per baris.

12
Glorytoad
cat TypeScript | Perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > TypeScript-processed
9
Peter Nore
# The "sed -r" trick does not work on every Linux, I still dunno why:
DECOLORIZE='eval sed "s,${END}\[[0-9;]*[m|K],,g"'

=> howto use:

<commands that type colored output> | ${DECOLORIZE}

diuji pada: - AIX 5.x/6.1/7.1 - Linux Mandrake/Mandriva/SLES/Fedora - SunOS

6
scavenger

Ada sebuah ansi2txt perintah dalam colorized-logs paket di Ubuntu. Itu menghapus kode warna ANSI dengan baik, tetapi itu tidak berurusan dengan hal-hal seperti progress bar yang dihasilkan oleh memancarkan ^H atau ^M karakter untuk menimpa teks pada tempatnya. col -b dapat menangani yang , jadi untuk hasil terbaik Anda dapat menggabungkan keduanya

cat TypeScript | ansi2txt | col -b
5
Marius Gedminas

Saya memecahkan masalah dengan menjalankan scriptreplay di layar dan membuang buffer scrollback ke sebuah file.

Skrip harapan berikut melakukan ini untuk Anda.

Ini telah diuji untuk file log dengan hingga 250.000 baris. Di direktori yang berfungsi Anda memerlukan skrip, file bernama "waktu" dengan 10.000.000 kali baris "1 10" di dalamnya, dan skrip. Saya membutuhkan nama file script Anda sebagai argumen baris perintah, seperti ./name_of_script name_of_scriptlog.

#!/usr/bin/expect -f 

set logfile [lindex $argv 0]

if {$logfile == ""} {puts "Usage: ./script_to_readable.exp \$logfile."; exit}

set timestamp [clock format [clock sec] -format %Y-%m-%d,%H:%M:%S]
set pwd [exec pwd]
if {! [file exists ${pwd}/time]} {puts "ERROR: time file not found.\nYou need a file named time with 10.000.000 times the line \"1 10\" in the working directory for this script to work. Please provide it."; exit}
set wc [exec cat ${pwd}/$logfile | wc -l]
set height [ expr "$wc" + "100" ]
system cp $logfile ${logfile}.tmp
system echo $timestamp >> ${logfile}.tmp
set timeout -1
spawn screen -h $height -S $timestamp 
send "scriptreplay -t time -s ${logfile}.tmp 100000 2>/dev/null\r"
expect ${timestamp} 
send "\x01:hardcopy -h readablelog.${timestamp}\r"

send "exit\r"

system sed '/^$/d' readablelog.$timestamp >> readablelog2.$timestamp
system head -n-2 readablelog2.$timestamp >> ${logfile}.readable.$timestamp
system rm -f readablelog.$timestamp readablelog2.$timestamp ${logfile}.tmp

File waktu dapat dibuat oleh

for i in $(seq 1 10000000); do echo "1 10" >> time; done
3
hnkchnsk

Saya lebih suka menggunakan alat khusus untuk mengubah output skrip menjadi teks biasa, yang secara konstan didukung dan diuji dengan baik, melalui custom regexp. Jadi ini berhasil bagi saya:

$ cat TypeScript | ansi2txt | col -bp > TypeScript.txt.bp    
$ cat -v TypeScript.txt.bp

perintah skrip menangkap ke dalam file TypeScript ansi2txt - mengonversi kode ansi dengan lolos seperti colorcodes, backspaces dll menjadi teks biasa, namun saya menemukan bahwa pasangan lolos masih tersisa. col -bp - menghapusnya sepenuhnya.

Saya sudah menguji ini pada disko Ubuntu terbaru, dan itu berhasil.

1
Dmytro Brazhnyk

Saya menemukan bahwa hanya menggunakan cat adalah yang saya butuhkan untuk melihat output dari script di terminal. Ini tidak membantu ketika mengarahkan output ke file lain, tetapi membuat hasilnya dapat dibaca, tidak seperti cat -v, col -b, atau editor teks.

Untuk menghilangkan warna atau menyimpan hasil ke file, salin dan tempel output secara manual dari cat ke dalam editor teks, atau ke perintah cat lainnya, yaitu:

cat > endResult << END
<paste_copied_text_here>
END
1
Roger Dueck

Menemukan pertanyaan ini sambil mencari solusi untuk masalah yang sama. Sedikit lagi menggali dan menemukan skrip ini di Live Journal di tautan ini. Saya bekerja dengan sempurna untuk saya. Ini juga merupakan tulisan yang sangat bagus tentang masalah ini dan bagaimana solusinya bekerja. Pasti layak dibaca. http://jdimpson.livejournal.com/7040.html

#!/usr/bin/Perl -wp

# clean up control characters and other non-text detritus that shows up 
# when you run the "script" command.

BEGIN {
# xterm titlebar escape sequence
$xtermesc = "\x1b\x5d\x30\x3b";

# the occurence of a backspace event (e.g. cntrl H, cntrol W, or cntrl U)
$backspaceevent = "\x1b\\\x5b\x4b"; # note escaping of third character

# ANSI color escape sequence
$ansiesc = qr/\x1b\[[\d;]*?m/;

# technically, this is arrow-right. For some reason, being used against
# very long backspace jobs. I don't fully understand this, as evidenced
# by the fact that is off by one sometimes.
$bizarrebs = qr/\x1b\[C/;

# used as part of the xterm titlebar mechanism, or when
# a bell sounds, which might happen when you backspace too much.
$bell = "\x07"; # could use \a

$cr = "\x0d"; # could use \r

$backspace = "\x08"; # could use \b
}

s/$xtermesc.+?$bell//g;
s/[$cr$bell]//g;
s/${backspaceevent}//g;
s/$ansiesc//g;
while (s/(.)(?=$backspace)//) { s/$backspace//; } # frickin' sweet 
# For every ^H delete the character immediately left of it, then delete the ^H.
# Perl's RE's aren't R, so I wonder if I could do this in one expression.
while (s/(..)(?=$bizarrebs)//) { s/$bizarrebs//; }
1
SammerV

Meskipun solusi yang diberikan sejauh ini berfungsi dengan baik untuk menghapus urutan kontrol, namun mereka juga menghapus kode pemformatan. Hasilnya adalah bahwa tabel-tabel dalam output disatukan. Persyaratan saya hanya untuk dapat melihat dan mencari dalam file log sesi yang dikumpulkan dari terminal. Solusi yang paling berhasil bagi saya adalah menggunakan -r.

less -r session.log
0
AliA