Bagaimana cara menonaktifkan line wrap di terminal?

55

Saya perlu melihat file log besar menggunakan shell bash. Saya menggunakan lessuntuk membuka file, tetapi karena garis terlalu panjang ada semacam pembungkus baris / kata yang terjadi.

Karena file-file tersebut adalah log Log4J, dan ada pola di awal setiap baris, memiliki garis yang dibungkus membuat sulit untuk menganalisis output, jadi saya mulai menggunakan less -Syang memotong garis panjang.

Tapi sekarang saya harus menggunakan tail -f, dan itu juga membungkus output. Apakah mungkin untuk menonaktifkan pembungkus baris dalam shell bash untuk semua perintah?

Catatan: ada jawaban untuk pertanyaan berbeda yang menyebutkan urutan pelarian echo -ne '\e[?7l', tetapi tampaknya tidak bekerja dengan bash.

nunaxe
sumber
4
Perhatikan bahwa ini tidak terkait dengan shell (bash) pilihan Anda, tetapi itu dapat bergantung pada terminal pilihan Anda (xterm, Terminal, terminal gnome, konsole, ...). Lihat Apa perbedaan yang tepat antara 'terminal', 'shell', 'tty' dan 'konsol'?
Gilles 'SO- stop being evil'
4
Seperti yang disebutkan Gilles, ini adalah masalah terminal emulator. Misalnya, di screen, ada perintah "wrap". Di xterm, ada -awopsi untuk mencegah pembungkus garis otomatis. Kemungkinan ada beberapa sumber X untuk emulator terminal lainnya. Emulator apa yang Anda gunakan?
Arcege
Saya menggunakan gnome-terminal.
nunaxe
1
@Arcege: Sebenarnya, ini +awuntuk xterm:) Tapi, ini menyelesaikan masalah untuk output (misalnya, ls -ldengan banyak pada nama Windows-ish panjang dari TPB, berfungsi dengan baik), untuk input , saat memasukkan perintah, Anda mungkin masih ingin membungkus (atau, setidaknya Anda tidak menginginkannya seperti sekarang +aw: coba tulis di luar "batas kolom" dan kemudian mundur untuk bug GFX besar).
Emanuel Berg
Ngomong-ngomong, sepertinya tidak urxvtjuga tidak rxvtdapat menonaktifkan wraps baris.
Emanuel Berg

Jawaban:

7

Apakah Anda benar-benar perlu tail -fatau akan melakukan sesuatu seperti less +Fitu? Karena kedengarannya Anda masih menginginkan pager interaktif, menurut saya akan lebih mudah untuk bertahan lessdaripada menerapkannya sendiri.

Catatan terakhir: sudahkah Anda mempertimbangkan tail -f file | less?

jw013
sumber
Saya membuat beberapa pengalaman dengan screendan xtermkarena emulator itu memiliki opsi untuk mencegah garis pembungkus. Tetapi ada perbedaan besar antara memotong garis dan menyembunyikan ekor garis sehingga kita bisa melihatnya jika kita mau. Menggunakan tail -f file | less -Stidak sempurna karena tampaknya menonaktifkan -ftetapi ini adalah solusi terbaik yang saya temukan.
nunaxe
@Boris Marcos mungkin lebih baik. Ini menggunakan lesssecara langsung.
AnthonyD973
51

Mencoba:

less -S +F filename

  • Tekan Ctrlcuntuk berhenti tailing dan sekarang Anda dapat bergerak ke kiri dan ke kanan menggunakan tombol kursor.
  • Tekan Shiftfuntuk melanjutkan tailing
  • Tekan Ctrlc, quntuk berhenti
Boris Marcos
sumber
Ini bagus! Sudah memiliki terminal saya span dua layar, tetapi sejak saya membaca ini kemarin saya hanya menyalurkan output lebar untuk less -S. Juga sangat bermanfaat di laptop.
Jonatan Öström
15

Andaikan Anda memiliki COLUMNSvariabel yang ditentukan, Anda dapat mengeksekusi

tail -f your-app.log | cut -c -$COLUMNS

jika tidak gantikan $COLUMNSdengan lebar kolom terminal, seperti yang diperoleh stty -a.

enzotib
sumber
2
Alternatif lain untuk $COLUMNS(tidak segera diperbarui pada SIGWINCH, hanya pada prompt berikutnya) dan stty -a(lebih sulit untuk digunakan dalam skrip) adalah tput cols.
manatwork
Terima kasih enzotib. Itu bekerja, tetapi itu memotong garis dan kita tidak dapat melihat ujung garis panjang. Apakah mungkin untuk cutberperilaku seperti di less -Smana garis panjang buffered dan kita dapat melihat garis lengkap menggunakan kunci arah?
nunaxe
Uhm, tidak sesederhana itu. Saya sedang memikirkan solusi kabel seperti misalnya dua screenjendela terpisah masing-masing dengan tail -f | cutscript atau meniru dalam beberapa cara lessperilaku. Tetapi tidak punya solusi, saat ini.
enzotib
1
Catatan sisi: potong hanya hitungan byte; tidak seperti less -Situ, itu akan mengacaukan teks berwarna, atau apa pun dengan lolos ANSI. Mungkin mengacaukan Unicode juga.
DAPAT DITERBITKAN
Ya, less -Slebih bermanfaat dengan teks berwarna. Anda dapat menggunakan less -S -Euntuk segera keluar - berguna untuk memotong output berwarna pada $ COLUMNS.
blueyed
4

Anda dapat menonaktifkan pembungkus baris less, taildan setiap perintah lainnya di bawah Linux sun dengan:

tput rmam

Untuk mengembalikan penggunaan pembungkus baris:

tput smam
WinEunuuchs2Unix
sumber
3

Terminal emulator terminal (http://software.jessies.org/terminator/) memungkinkan untuk tidak membungkus garis panjang dan memiliki pengguliran horizontal (tetapi ditulis dalam Java).

Gentledevil
sumber
Bagaimana cara mengaktifkannya? Tampaknya tidak berfungsi secara default.
defhlt
Pada tulisan ini, gulir horizontal diaktifkan secara default. Rekomendasi lintas platform yang luar biasa. Terima kasih!
user7089
Harap jadikan jawaban ini lebih baik dengan menunjukkan bagaimana orang akan mengaktifkan fitur ini. Saya telah mencari di Preferensi dan sepertinya tidak dapat menemukan opsi ini. FWIW, saya sedang berlari terminator v1.91.
AnthonyK
2
@AnthonyK Ada dua terminal emulator yang tidak berhubungan berbagi nama terminator, ini salah satu yang gentledevil mengacu dan bahwa salah satu yang Anda gunakan.
jlliagre
3

Dua jawaban / contoh yang bagus di sini

http://www.commandlinefu.com/commands/view/1710/tail-a-log-file-with-long-lines-truncated

tail -f logfile.log | cut -b 1-80

tail -f logfile.log | cut -b -$(tput cols)

Satu peringatan: setidaknya pada terminal bawaan pada cut Mac saya tampaknya tidak menangani karakter tab dengan sangat baik. Tampaknya ini menampilkannya dengan misalnya, 8 spasi tetapi hanya menghitungnya sebagai 4 ruang lebar atau sesuatu seperti itu. Dengan kata lain, jika terminal Anda memiliki lebar 80 karakter dan output Anda mengandung beberapa tab per baris, Anda harus mengatur lebarnya menjadi 60 atau sekitar itu. YMMV.

db
sumber
2

Gunakan opsi di bawah ini dengan less. Ini akan menonaktifkan bungkus kata dan mempertahankan warna teks, jika ditentukan.

less -SR +F filename

Kamal Nayan
sumber
2

Ada beberapa contoh pada halaman ini, dengan piping -f ... dari pengujian saya itu tidak berfungsi dengan baik, jika Anda benar-benar membutuhkan pemipaan (mis. Jika Anda perlu memipis sesuatu yang lebih, seperti grep), Anda dapat menggunakan sesuatu seperti :

watch -n 1 'tail -n $(($LINES-3)) file.log | cut -c -$COLUMNS'

mungkin bukan yang terbaik untuk kinerja tetapi berfungsi ... jika tidak ada pipping tambahan yang diperlukan Anda dapat menggunakan sesuatu yang berbeda seperti:

less -S +F file.log
nars
sumber
2

Ada banyak komentar yang menyimpang dari pertanyaan. Pertanyaan OP adalah

Tapi sekarang saya harus menggunakan tail -f, dan itu juga membungkus output. Apakah mungkin untuk menonaktifkan pembungkus baris dalam shell bash untuk semua perintah?

Beberapa komentar dibuat tentang fitur autowrap, yang menyatakan bahwa tidak semua terminal memilikinya. Mungkin. Tetapi (selain terminator , yang pengembangnya tidak mendokumentasikan deskripsi terminal ) semua contoh yang diberikan adalah xterm, rxvt dan beberapa mirip atau turun. Itu semua terkait.

The +awpilihan di xtermberkorespondensi dengan autoWrapsumber daya. Berkonsultasi dengan manual, dikatakan bahwa

   autoWrap (class AutoWrap)
           Specifies  whether  or  not  auto-wraparound should be enabled.
           This is the same as the VT102 DECAWM.  The default is "true".

dan di XTerm Control Sequences katanya

CSI ? Pm h
          ...
          DEC Private Mode Set (DECSET).
            Ps = 7  -> Wraparound Mode (DECAWM).

yang tentunya tidak "bergantung pada terminal pilihan Anda", karena terminal apa pun dengan kompatibilitas VT100 mendukung fitur ini. xterm dan rxvt melakukan ini, misalnya. Yang lain juga melakukannya.

Apakah fitur akan berguna untuk OP masih bisa diperdebatkan. Menekan pembungkus baris hanya satu aspek dari masalah:

  • Shell tahu lebar terminal — tetapi itu bisa diganti dengan menetapkan COLUMNSke nilai "besar".
  • Tentu saja itu berarti bahwa aplikasi akan menghabiskan banyak waktu menulis di margin kanan (dan beberapa, salah, akan memulai baris baru pula).
  • OP mungkin berasumsi bahwa aplikasi akan menggulir ke kiri / kanan untuk membuat terminal lebar dapat digunakan. (terminator melakukan ini - sebagian - tetapi kelemahan lainnya membatalkannya, kecuali bagi mereka yang hanya menggunakan terminal untuk catlogfile ke layar).
  • Apa yang sebenarnya dicari OP adalah seperangkat alat yang dapat dikatakan untuk menonaktifkan pembungkus baris, terutama untuk melihat file log. Jika terminal bekerja cukup baik untuk penggunaan umum, itu tidak relevan dengan pilihan alat yang digunakan dalam terminal.

Ada pager yang dapat melakukan apa yang diperlukan, misalnya, multitail yang mencantumkan fitur-fiturnya

Pembungkus garis dapat dimatikan, setelah itu orang dapat menggulir ke kiri / kanan dengan tombol kursor

Berbasis ncurses, ia harus bekerja pada terminal yang dikutip.

Thomas Dickey
sumber
1

vi

di dalam tipe vi

:set nowrap

Saya percaya ada juga plugin untuk vi yang akan memberi Anda perilaku seperti ekor.

Jacques
sumber
-1

Jika Anda benar-benar ingin melihat baris penuh, Anda dapat menyalin dan menempelkan teks ke dalam editor teks seperti Atom atau Notepad ++ dan menonaktifkan wraps baris di sana.

James Heazlewood
sumber