Linux 'script' komutunun çıktısını temizleme


35

Bazı etkileşimli oturumları izlemek için http://www.linuxcommand.org/man_pages/script1.html linux 'script' komutunu kullanıyorum . Buradaki çıktı dosyaları, geri aldığım tuş vuruşlarım dahil yazdırılamayan karakterler içeriyor.

Bu çıktı dosyalarını düzenlemek için yalnızca ekranda görüntülenenleri içermenin bir yolu var mı?

Veya etkileşimli bir kabuk oturumunu kaydetmenin başka bir yolu var mı (giriş ve çıkış)?


"Veya etkileşimli bir kabuk oturumu kaydetmenin başka bir yolu var mı (giriş ve çıkış)?" Biliyor musunuz asciinema.org ?
masterxilo

Yanıtlar:


34

Dosyayı görüntülemek istiyorsanız, çıkışı gönderebilirsiniz col -bp; bu kontrol karakterlerini yorumlar. O zaman istersen, daha az boru kullanabilirsin.

col -bp typescript | less -R

Bazı sistemlerde coldosya adı argümanını kabul etmeyecek, bunun yerine bu sözdizimini kullanın:

col -bp <typescript | less -R

1
sistemimde colbir dosya adını kabul etmedim, bu yüzden istediğim şeyi yaptım col -bp < typescript ve aldım.
Andrew

Benim için çalışmıyor, çıktının bir kısmını karıştırıyor.
Alex

1
Benim sistemimde less -Rkendi başına col -bpilk önce borulamadan daha iyi çıktı sağlar .
Brian Hawkins

@BrianHawkins hemfikir. Kullanımı col -bp <typescript | less -Rrenklendirilmiş konsolu göstermez. Kullanarak less -R typescriptrenklendirilmiş konsolu görüntüler!
Trevor Boyd Smith

bu yalnızca komut dosyasını etkileşimli olarak görüntülemek istiyorsanız iyidir less.
Trevor Boyd Smith

18
cat typescript | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > typescript-processed

işte string girişinin bazı yorumları perl:

  • s/pattern//ggiriş yerine, tümüyle bir değişiklik yapacak olan gseçenek ( seçenek, birinci yerine durmak yerine her şeyi yapar) giriş dizesi

burada regex modelinin bir yorumunu bulabilirsiniz:

  • \e Özel "kaçış" kontrol karakterini eşleştir (ASCII 0x1A)
  • (ve )bir grubun başlangıcı ve sonu
  • |grubun N paterninden biriyle eşleşebileceği anlamına gelir. N desenleri nerede
    • [^\[\]] veya
    • \[.*?[a-zA-Z] veya
    • \].*?\a
  • [^\[\]] anlamına geliyor
    • karakterlerin olmadığı bir dizi NOT karakteri eşleştirin [ve]
  • \[.*?[a-zA-Z] anlamına geliyor
    • ile başlayan bir dize eşleştirin, [sonra .*?ilk alfa karakterine kadar açgözlü olmayan bir işlem yapın
  • \].*?\a anlamına geliyor
    • ile başlayan bir dize eşleştirin, ]sonra .*?"uyarı (zil) karakteri" adlı özel kontrol karakterine gelinceye kadar açgözlü olmayan yapın.

1
Hala nasıl olduğunu
bulmam

@ asdmin - Temel olarak, bu, çıktısını belirli kontrol karakterlerini çıktıdan kaldıran typescriptbir perlprogramın çıktısını yansıtır , ardından çıktısını, transkriptteki herhangi bir "delete" anahtar artefaktını kaldıran unix colkomutuna yönlendirir -b. Daha sonra çıktıyı bir metin dosyasına aktarır.
Peter Nore

Bu benim için yazı tipinin ilk satırındaki çıktıları karıştırıyor ama en iyi cevap bu.
Alex

Bu bazı yazı tipleri ile çok iyi çalışıyor gibi görünüyor; Kabul edilen cevabın ürettiği çıktıdan kesinlikle daha okunur.
fakedad

efsanevi cevap!
zack

2

Çok miktarda scriptçıktı almak için yinelenen bir perl betiğini keserdim. Aksi halde, iyi bir editörle el düzenleme.

Kontrol karakterlerini scriptçıktıdan ekrandan belirli önemli anlarda (ana bilgisayar bir kullanıcı girişinin ilk karakterini beklerken olduğu gibi) görüntülenenleri üreten şekilde çıkartan otomatik bir yöntem mevcut değildir .

Örneğin ekran haricinde boş olabilir Andrew $daha sonra yazılı takdirde rm /*(çok daha gerekenden daha) ve pres geri silme on iki kez, yani sonunda ekranda gösterilen Nelerin kabuk koşuyordu bağlıdır, geçerli neler sttyayarları ( (bir seansta partway'i değiştirebileceğiniz) ve muhtemelen başka bazı faktörler de olabilir.

Yukarıdakiler, girdi ve çıktıları sürekli olarak yakalamak için otomatikleştirilmiş herhangi bir yöntem için geçerlidir. Ana alternatif, "ekran görüntüleri" almak veya oturumu sırasında uygun zamanlarda ekranı kesip yapıştırmaktır (kullanıcı kılavuzları için ne yapıyorum, günlük kaydı için notlar, vb.).



2

cat filenameKontrol karakterlerini kaldıran kullandım :-)


imo bu gerçekten daha iyi bir cevap, çünkü gerçekten tüm kontrol karakterlerini siler .
Nathanael Farley

OSX'te, kedi renk kontrol karakterlerini kaldırmaz ...
Nick,

9
Aslında, kedi kontrol karakterlerini hiç kaldırmaz, aksine kendi cümlelerini çıkarır ve terminal onları yorumlar. Yazı diziniz terminal arabelleğinize göre kısaysa bu sizin için işe yarayabilir ve sadece terminalden kopyalayıp yapıştırabilirsiniz. Eğer yazı diziniz büyükse, o kadar iyi değil.
mc0e

1
Kabul. Bu hiçbir şeyi kaldırmaz. Bu sadece kabuğun onları yorumlamasını sağlar. Hala varlar.
Kentgrav

2

Eğer ne sonra konum (sonradan bir bash betiği bunları açmak için örneğin) sizin komutlarının kaydedilmesi için, sonra makul kesmek çalıştırmaktır script(1)çalıştırıldığı içeride, sonra

bash -x

Daha grepsonra çıkış dosyası (genellikle "typescript"), "+" ile başlayan satırları arar. Düzenli ifade ^\+hile yapacak.


2

Çıktıyı bir dosyaya yazmak istiyorsanız:

col -bp < typescript >>newfile

İsterseniz dosyayı Windows formatına dönüştürmek için unix2dos komutunu kullanın.


1
Ubuntu 14.04'te, bu satırların başında ve sonunda çok fazla önemsiz kalıyor. Oldukça okunabilir, ancak gerçekten temiz değil.
mc0e

2

col -bp, geri alanları istediğiniz gibi işler (AFAIK). Ancak renk kaçış dizilerini düzenler. Önce renk sekanslarını çıkarmak, ardından mümkünse geri boşlukları işlemek iyi olabilir.

Bu çok yaygın bir ihtiyaç ve bunun için daha fazla çözüm olmadığına şaşırdım. Bir oturumu başlatmak oldukça yaygındır, daha sonra birinin prosedürü gözden geçirme ihtiyacı vardır. Tüm küçük yazım hatalarını kesmek ve gelecekteki referans için prosedürün "temiz" bir senaryosunu oluşturmak için renk kaçış dizilerini kesmek istiyorsunuz. Basit ASCII metni tercih edildi. Bence bu "insan tarafından okunabilir" tarafından kastedilen şeydir ve yapılması gereken çok makul bir şeydir.


1

Perl'in sizin için uygun olduğu bir ortamdaysanız, Dewtall'in Unix tahtasında benzer bir soruya verdiği cevabı kontrol karakterlerinin senaryo çıktısından çıkarmakta daha etkili olduğunu gördüm .

dewtall'in senaryosu:

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

Kontrol karakterlerini kaldırmak için:

./dewtalls-script.pl < output-from-script-that-needs-control-characters-removed


0

Bunu yapmak için iyi bir yol buldum. Sistemimde uzun çıkış hatları "^ M" (boşluk bıraktıktan sonra satırbaşı) ile serpiliyor. "^ M", dosyaya girdiğinizde hiç görüntülenmeyen "^ @" boş karakteriyle güzel bir şekilde değiştirilebilir.

Ben de zamanlamayı yakalarım, bu yüzden dosyayı mükemmel bir şekilde oynatmak için, aşağıdaki komutları kullanarak "^ M" yi tamamen kaldıramıyorum (çünkü scriptreplay byte sayar):

tr '\r' '\0' | sed 's/ \x0//g'

Senaryo komutumu şöyle çalıştırıyorum:

script -t -f session.log 2>timing

Peki, sonra ne yapacağım:

cat session.log | tr '\r' '\0' > typescript 
scriptreplay -t timing | sed 's/ \x0//g'

İlk düzenleme (yeniden oynatmadan önce) dosyadaki bayt sayısını korur. İkinci düzenleme (tekrardan sonra) rastgele yerlerde beyaz alandan kurtulur. (Varsayılan scriptreplay öğesinin "typescript" adlı giriş dosyasını aradığını ve bu nedenle "zamanlama" işleminden sonra sağlamadığımı unutmayın.)


-1

Çıkışta dos2unix de hile yapacak


7
Görevi başarmak için nasıl kullanılacağını açıklayabilir misiniz?
Ben N

-1

Diğer bir çözüm, stringsbir dosyadan (veya standart girişten) yalnızca yazdırılabilir karakterleri basan kullanmaktır :

strings -n 1 filename

-n 1Seçenek birine korunacak dizilerin asgari uzunluğunu belirler ve böylece olmayan basılabilir karakterler çevrili emin hatta tek yazdırılabilir karakterleri korunur hale getirir.

Bu yaklaşımın olası bir dezavantajı strings, yazdırılabilir karakterlerin bitişik dizeleri arasına satır kesmeleri eklemektir. Örneğin içeriği olan bir dosya

Foo<SOMECONTROLCHAR>Bar

(burada <SOMECONTROLCHAR>kontrol karakteri veya yazdırılamayan diğer herhangi bir karakter)

Foo
Bar

Yorumlarda ortaya çıkan bir diğer konu, kontrol karakterlerinin bazı dizilerinin hem yazdırılabilir hem de yazdırılamayan karakterlerin bir birleşiminden oluşmasıdır ve bu yaklaşım sadece bunların bir kısmını kaldıracaktır.

Ancak, stringssöz konusu geri alma gibi kontrol karakterlerini kaldırmak iyi bir iş çıkarır.


stringsyazdırılamayan tüm karakterleri kaldırmaz. Yazdırılabilir karakter dizilerini tanımlar ve yazdırır . Bu aynı şey değil.
bir CVn

@ MichaelKjörling, haklısın, varsayılan olarak stringsyalnızca minimum 4 uzunluktaki dizileri yazdırır -n 1. Minimum uzunluğu 1'e ayarlayan seçeneği ekleyerek cevabımı düzelttim . Buna dikkat çektiğiniz için teşekkürler.
justfortherec

Yanıt, hala stringsyazdırılamayan tüm karakterleri kaldıran aynı iddiada bulunduğundan , düzenlemeden önce olduğu gibi yine de yanlıştır. Ayrıca açık bir şekilde kırılmıştır, çünkü "bazı renk kodları" (ve genel olarak kontrol kodları) genellikle hem yazdırılabilir hem de yazdırılamaz karakterlerden oluşur. Örneğin, metin rengini değiştirmek için bir kontrol kodu dizisi , tek çıkış karakterinin olduğu ESC[01;52myerde olabilir ESC(bayt değeri 27). Önerdiğin stringsgibi kullanmak [01;52mçıktıda kalacaktı , anlamsız.
CVn

İyi nokta, @ MichaelKjörling. Özellikle renk kodlu örnek çok talihsizdi. Cevabımı geliştirmeme yardım ettiğin için teşekkürler. Düzenlemeler endişelerinizi uygun şekilde ele alıyor mu? stringsdiğer cevapların bazıları ile aynı işi yapamayabilir, ancak IMHO, soruda açıklanan sorunu çözmek için geçerli bir yaklaşımdır.
justfortherec
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.