it-swarm-tr.com

Kontrol karakterlerini (konsol kodları / renkleri dahil) komut dosyası çıktısından kaldırma

Komut satırında etkileşimli bir oturum kaydetmek için "komut dosyası" komutunu kullanabilirim. Ancak, tüm kontrol karakterleri ve renk kodlarını içerir. "Col -b" ile kontrol karakterlerini (backspace gibi) kaldırabilirim, ancak renk kodlarını kaldırmanın basit bir yolunu bulamıyorum.

Komut satırını normal şekilde kullanmak istediğimi unutmayın, bu yüzden renkleri orada devre dışı bırakmak istemiyorum - Sadece komut dosyası çıktısından kaldırmak istiyorum. Ayrıca, etrafta oynayabilir ve işleri düzeltmek için bir regexp bulmayı deneyebilirim, ancak daha basit (ve daha güvenilir - regexp'i geliştirdiğimde bilmediğim bir kod varsa?) Olduğunu umuyorum.

Sorunu göstermek için:

 spl62 tmp: script 
 Komut dosyası başladı, dosya TypeScript 
 spl62 lepl: ls 
 add-licence.sed build-example.sh tamamlama testi Push-dokümanlar .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 
 Komut dosyası tamamlandı, dosya TypeScript 
 spl62 tmp: cat -v TypeScript 
 Komut dosyası Per 09 Haz tarihinde başladı 2011 09:47:27 AM CLT 
 Spl62 lepl: ls ^ M 
 ^ [[0m ^ [[00madd-licence.sed ^ [[0m ^ [[00; 32mbuild-example.sh ^ [[0m ^ [[00mkomit testi ^ [[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: çıkış ^ M 
 
 Script 09. Haziran 2011 09:47:29 CLT 
 Spl62 tmp: col -b <TypeScript 
 Script 09 Perşembe tarihinde başladı 09 Haz 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 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: çıkış 
 
 Perşembe günü yapılan komut dosyası 09 Haz 2011 09:47:29 AM CLT 
71
andrew cooke

Aşağıdaki komut dosyasının tüm ANSI/VT100/xterm kontrol dizilerini filtrelemesi gerekir ( ctlseqs ). En az düzeyde test edilmiş, lütfen eksik veya fazla eşleşmeyi bildirin.

#!/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;
}

Bilinen Sorunlar:

  • Hatalı oluşturulmuş dizilerden şikayet etmez. Bu betiğin amacı bu değil.
  • DCS/PM/APC/OSC'ye yönelik çok satırlı dize bağımsız değişkenleri desteklenmez.
  • 128–159 aralığındaki baytlar, nadiren kullanılmasına rağmen, kontrol karakterleri olarak ayrıştırılabilir. ASCII olmayan kontrol karakterlerini ayrıştıran bir sürüm (bu, UTF-8 dahil bazı kodlamalarda ASCII olmayan metni değiştirir).
#!/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;
}

Gilles'in yanı sıra, satır başlarını kaldırmak ve önceki karakterleri geri almak için Cygwin'de oluşturulan bir TypeScript için benim için önemli olan cevabı güncelleniyor:

#!/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

Bu durumda sed kullanırdım.

yapmak:

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

sed -e "s/search/replace/g" standart öğelerdir. normal ifade aşağıda açıklanmaktadır:

\x1b _ renk kodundan önceki Escape ile eşleşir \[ ilk açık köşeli ayraçla eşleşir .\{1,5\} herhangi bir tek karakterin 1 ile 5'ine eşleşir. Zorunda \ Kabuk onları karıştırmasını önlemek için kıvırcık parantez. m normal ifadedeki son karakter - genellikle renk kodunu izler. // her şeyin yerini alacakları için boş dize. g her satıra birden çok kez eşleştirin.

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"'

=> nasıl kullanılır:

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

üzerinde test edilmiştir: - AIX 5.x/6.1/7.1 - Linux Mandrake/Mandriva/SLES/Fedora - SunOS

6
scavenger

Bir ansi2txtcolorized-logs paketi Ubuntu üzerinde. ANSI renk kodlarını güzel bir şekilde kaldırır, ancak ^H veya ^M karakteri metnin üzerine yazmak için. col -b bunlarla ilgilenebilir , böylece en iyi sonuçlar için ikisini birleştirebilirsiniz

cat TypeScript | ansi2txt | col -b
5
Marius Gedminas

Bir ekranda scriptreplay çalıştırarak ve geri kaydırma arabelleğini bir dosyaya dökerek sorunu çözdüm.

Aşağıdaki beklenti komut dosyası bunu sizin için yapar.

250.000 satıra kadar olan günlük dosyaları için test edilmiştir. Çalışma dizininde scriptlog'unuza, içinde "1 10" satırının 10.000.000 katı olan "time" adlı bir dosyaya ve script'e ihtiyacınız vardır. ./name_of_script name_of_scriptlog Gibi komut satırı argümanı olarak scriptfile adını gerekiyor.

#!/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

Zaman dosyası

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

Komut dosyası çıktısını özel regexp üzerinden sürekli desteklenen ve iyi test edilen düz metne dönüştürmek için özel araçlar kullanmayı tercih ederim. Bu benim için iş yaptı:

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

script komutu ansi2txt TypeScript dosyasına yakalar - ansi kodunu renk kodları, backspaces vb. col -bp - tamamen kaldırıldı.

Bunu en son Ubuntu diskoda test ettim ve işe yarıyor.

1
Dmytro Brazhnyk

Terminalde cat çıkışını görüntülemek için gereken tek şey script kullanarak buldum. Bu, çıktıyı başka bir dosyaya yönlendirirken yardımcı olmaz, ancak cat -v, col -b Veya bir metin düzenleyiciden farklı olarak sonucu okunabilir hale getirir.

Renkleri ortadan kaldırmak veya sonuçları bir dosyaya kaydetmek için, cat çıktısını manuel olarak kopyalayıp bir metin düzenleyicisine veya başka bir cat komutuna yapıştırın:

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

Aynı soruna bir çözüm ararken bu soruyu buldum. Biraz daha kazıp bu senaryoyu Live Journal'da buldum. Benim için mükemmel çalıştım. Ayrıca bu sorun ve çözümün nasıl çalıştığı hakkında çok iyi bir yazı. Kesinlikle bir okumaya değer. 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

Şimdiye kadar verilen çözümler kontrol sekanslarını çıkarmak için iyi çalışmasına rağmen, aynı zamanda biçimlendirme kodlarını da kaldırmaktadır. Sonuç, çıktıdaki tabloların birlikte ezilmesidir. Benim ihtiyacım sadece terminalden toplanan oturum günlük dosyalarını görüntülemek ve aramak mümkün oldu. Benim için en uygun çözüm daha az -r kullanmaktı.

less -r session.log
0
AliA