Saya menggunakan perintah 'script' linux http://www.linuxcommand.org/man_pages/script1.html untuk melacak beberapa sesi interaktif. File keluaran dari yang berisi karakter yang tidak dapat dicetak, termasuk penekanan tombol backspace saya.
Apakah ada cara untuk merapikan file output ini sehingga hanya berisi apa yang ditampilkan di layar?
Atau adakah cara lain untuk merekam sesi shell interaktif (input dan output)?
Jawaban:
Jika Anda ingin melihat file, maka Anda dapat mengirim output melalui
col -bp
; ini mengartikan karakter kontrol. Maka Anda bisa menyalurkan lebih sedikit, jika mau.Pada beberapa sistem
col
tidak akan menerima argumen nama file, gunakan sintaks ini sebagai gantinya:sumber
col
tidak akan menerima nama file, jadi saya lakukancol -bp < typescript
dan mendapatkan apa yang saya inginkan.less -R
dengan sendirinya memberikan output yang lebih baik daripada pemipaancol -bp
terlebih dahulu.col -bp <typescript | less -R
tidak menampilkan konsol berwarna. Menggunakanless -R typescript
memang menampilkan konsol berwarna!less
.inilah beberapa interpretasi input string ke
perl
:s/pattern//g
berarti melakukan substitusi pada keseluruhan (g
opsi berarti melakukan semuanya alih-alih berhenti pada pengganti pertama) string inputinilah beberapa interpretasi dari pola regex:
\e
cocok dengan karakter kontrol "pelarian" khusus (ASCII 0x1A)(
dan)
merupakan awal dan akhir suatu grup|
berarti grup dapat mencocokkan salah satu pola N. dimana pola N berada[^\[\]]
atau\[.*?[a-zA-Z]
atau\].*?\a
[^\[\]]
cara[
dan]
\[.*?[a-zA-Z]
cara[
kemudian lakukan non-serakah.*?
sampai karakter alfa pertama\].*?\a
cara]
kemudian lakukan non-serakah.*?
sampai Anda menekan karakter kontrol khusus yang disebut "karakter lansiran (bel)"sumber
typescript
keperl
program yang menghilangkan karakter kontrol tertentu dari output, kemudian menyalurkan output kecol
perintah unix , yang-b
opsi menghapus artefak kunci "hapus" dalam transkrip. Kemudian pipa output ke file teks.Untuk sejumlah besar
script
output, saya akan meretas skrip perl secara iteratif. Kalau tidak, edit tangan dengan editor yang baik.Tidak mungkin ada metode otomatis yang ada untuk menghapus karakter kontrol dari
script
output dengan cara yang mereproduksi apa yang ditampilkan di layar pada saat-saat penting tertentu (seperti ketika tuan rumah sedang menunggu karakter pertama dari beberapa input pengguna).Misalnya layar mungkin kosong kecuali
Andrew $
, jika Anda kemudian mengetikrm /*
dan menekan backspace dua belas kali (jauh lebih banyak dari yang diperlukan), apa yang ditampilkan pada layar pada akhirnya tergantung pada apa yang sedang berjalan, apastty
pengaturan Anda saat ini ( yang mungkin Anda ubah sebagian saat sesi berlangsung) dan mungkin beberapa faktor lain juga.Di atas berlaku untuk metode otomatis menangkap input dan output secara terus menerus. Alternatif utama adalah mengambil "tangkapan layar" atau memotong dan menempelkan layar pada waktu yang tepat selama sesi (yang saya lakukan untuk panduan pengguna, catatan untuk log harian, dll).
sumber
Sebuah jawaban untuk bagian kedua dari pertanyaan saya adalah menggunakan fasilitas logging di layar gnu:
^A H
dari dalam sesi layar berjalan. Dokumentasi di http://www.gnu.org/software/screen/manual/screen.html#Loggingsumber
Saya menggunakan
cat filename
yang menghilangkan karakter kontrol :-)sumber
Jika yang Anda kejar adalah merekam perintah Anda (mis. Untuk kemudian mengubahnya menjadi skrip bash), maka peretasan yang masuk akal harus dijalankan
script(1)
, kemudian di dalamnya jalankanSetelah itu
grep
file output (biasanya "naskah") mencari baris yang dimulai dengan "+". Ekspresi reguler^\+
akan melakukan trik.sumber
Jika Anda ingin menulis output ke file:
gunakan perintah unix2dos untuk mengonversi file ke format Windows jika Anda mau
sumber
col -bp memproses backspaces seperti yang diinginkan (AFAIK). Tapi itu mengubah urutan warna. Mungkin bagus untuk menghapus urutan warna terlebih dahulu, kemudian memproses backspaces, jika memungkinkan.
Ini adalah kebutuhan yang sangat umum, dan saya terkejut tidak ada lebih banyak solusi untuk itu. Sangat umum untuk skrip sesi, maka seseorang harus meninjau prosedur. Anda ingin memotong semua kesalahan pengetikan kecil, dan urutan pelarian warna untuk membuat skrip "bersih" dari prosedur untuk referensi di masa mendatang. Teks ASCII sederhana lebih disukai. Saya pikir inilah yang dimaksud dengan "dapat dibaca manusia", dan itu adalah hal yang sangat masuk akal untuk dilakukan.
sumber
Saya menemukan jawaban bahwa dewtall memberikan pertanyaan serupa di papan Unix agar lebih efektif dalam menghilangkan karakter kontrol dari output skrip jika Anda berada di lingkungan di mana Perl tersedia untuk Anda.
skrip dewtall:
Untuk menghapus karakter kontrol:
sumber
https://github.com/RadixSeven/typescript2txt ditulis untuk mengatasi masalah ini.
Sudah 4 tahun sejak saya terakhir diperbarui / menggunakannya, tapi saya tidak ingat melakukan sesuatu yang mewah yang seharusnya tidak berfungsi hari ini.
sumber
Saya menemukan cara yang baik untuk melakukannya. Di sistem saya, jalur output panjang ditaburi dengan "^ M" (ruang kosong diikuti oleh carriage return). "^ M" dapat diganti dengan baik dengan karakter nol "^ @", yang tidak ditampilkan sama sekali saat Anda menyimpan file.
Saya menangkap waktu juga, jadi untuk memutar ulang file dengan sempurna, saya tidak bisa menghapus "^ M" sepenuhnya menggunakan perintah di bawah ini (karena scriptreplay menghitung byte):
Saya menjalankan perintah skrip saya seperti ini:
Jadi, apa yang saya lakukan setelah itu adalah:
Hasil edit pertama (sebelum replay) mempertahankan jumlah byte dalam file. Suntingan kedua (setelah replay) menghilangkan ruang putih di tempat acak. (Perhatikan bahwa secara default scriptreplay mencari file input bernama "naskah", itulah sebabnya saya tidak menyediakannya setelah "waktu".)
sumber
dos2unix pada output juga akan melakukan trik
sumber
Satu solusi lain adalah menggunakan
strings
yang hanya mencetak karakter yang dapat dicetak dari file (atau dari input standar):The
-n 1
pilihan menetapkan panjang minimum dari urutan harus dipertahankan untuk satu dan dengan demikian membuat karakter yang dapat dicetak memastikan bahkan tunggal dikelilingi oleh karakter non-printable yang diawetkan.Satu kelemahan yang mungkin dari pendekatan ini adalah bahwa
strings
menambahkan jeda baris di antara rangkaian karakter yang dapat dicetak yang berdekatan. Misalnya file dengan konten(di mana
<SOMECONTROLCHAR>
karakter kontrol atau karakter tidak dapat dicetak lainnya) akan dikembalikan sebagaiMasalah lain yang muncul dalam komentar adalah bahwa beberapa urutan karakter kontrol terdiri dari kombinasi karakter yang dapat dicetak dan yang tidak dapat dicetak dan pendekatan ini hanya akan menghilangkan sebagian dari karakter tersebut.
Namun,
strings
melakukan pekerjaan yang baik untuk menghapus karakter kontrol seperti backspace yang disebutkan dalam pertanyaan.sumber
strings
tidak menghapus semua karakter yang tidak dapat dicetak. Ini mengidentifikasi dan mencetak urutan karakter yang dapat dicetak . Itu bukan hal yang sama.strings
hanya mencetak urutan panjang minimum 4. Saya telah memperbaiki jawaban saya dengan menambahkan-n 1
opsi yang menetapkan panjang minimum menjadi 1. Terima kasih telah menunjukkan ini.strings
menghapus semua karakter yang tidak dapat dicetak, jadi masih salah dengan cara yang sama sebelum diedit. Jelas juga rusak karena "beberapa kode warna" (dan kode kontrol pada umumnya) sering terdiri dari karakter yang dapat dicetak dan yang tidak dapat dicetak. Misalnya, urutan kode kontrol untuk mengubah warna teks mungkin diESC[01;52m
manaESC
karakter pelarian tunggal (nilai byte 27). Menggunakanstrings
seperti yang Anda sarankan akan meninggalkan[01;52m
dalam output, yang tidak ada artinya.strings
mungkin tidak melakukan pekerjaan yang sama dengan beberapa jawaban lain tetapi IMHO itu adalah pendekatan yang valid untuk menyelesaikan masalah yang dijelaskan dalam pertanyaan.