Làm thế nào để vô hiệu hóa bọc dòng trong một thiết bị đầu cuối?


55

Tôi cần phải xem các tệp nhật ký lớn bằng cách sử dụng shell bash. Tôi đã sử dụng lessđể mở các tập tin, nhưng vì các dòng quá dài nên có một số loại gói / dòng từ đang diễn ra.

Vì các tệp là các bản ghi Log4J và có một mẫu ở đầu mỗi dòng, việc có các dòng được bọc khiến việc phân tích đầu ra trở nên khó khăn, vì vậy tôi bắt đầu sử dụng less -Scác dòng dài.

Nhưng bây giờ tôi cần sử dụng tail -f, và nó cũng kết thúc tốt đẹp đầu ra. Có thể vô hiệu hóa dòng bọc trong vỏ bash cho tất cả các lệnh?

Lưu ý: có một câu trả lời cho một câu hỏi khác đề cập đến chuỗi thoát echo -ne '\e[?7l', nhưng dường như nó không hoạt động trên bash.


4
Lưu ý rằng điều này không liên quan đến sự lựa chọn shell của bạn (bash), nhưng nó có thể phụ thuộc vào lựa chọn thiết bị đầu cuối của bạn (xterm, Terminal, gnome-terminal, konsole, đấm). Xem sự khác biệt chính xác giữa 'thiết bị đầu cuối', 'vỏ', 'tty' và 'bàn điều khiển' là gì?
Gilles 'SO- ngừng trở nên xấu xa'

4
Như Gilles đã đề cập, đó là vấn đề của trình giả lập thiết bị đầu cuối. Ví dụ, trong screen, có một lệnh "bọc". Trong xterm, có một -awtùy chọn để ngăn chặn kết thúc dòng tự động. Có thể có một số tài nguyên X cho các trình giả lập thiết bị đầu cuối khác. Bạn đang sử dụng trình giả lập nào?
Arcege

Tôi đang sử dụng gnome-terminal.
nunaxe

1
@Arcege: Trên thực tế, nó là +awdành cho xterm:) Nhưng, điều này giải quyết vấn đề cho đầu ra (ví dụ: ls -lvới một loạt các tên Windows-ish dài từ TPB, nó hoạt động tốt), đối với đầu vào , khi nhập lệnh, có thể bạn vẫn còn muốn bao bọc (hoặc, ít nhất là bạn không muốn nó như bây giờ +aw: hãy thử viết vượt ra khỏi "đường viền cột" và sau đó quay lại tìm lỗi GFX lớn).
Emanuel Berg

Nhân tiện, có vẻ như không phải urxvtcũng không rxvtthể vô hiệu hóa kết thúc tốt đẹp.
Emanuel Berg

Câu trả lời:


7

Bạn có thực sự cần tail -fhoặc sẽ làm một cái gì đó như less +Flàm? Vì có vẻ như bạn vẫn muốn một máy nhắn tin tương tác, nên đối với tôi, nó sẽ dễ dàng gắn bó lesshơn nhiều so với việc tự thực hiện lại một cái.

Một lưu ý cuối cùng: bạn đã xem xét tail -f file | less?


Tôi đã thực hiện một số kinh nghiệm với screenxtermvì các trình giả lập đó có các tùy chọn để ngăn chặn kết thúc dòng. Nhưng có một sự khác biệt lớn giữa việc cắt xén dòng và ẩn đuôi của dòng để chúng ta có thể xem nó nếu muốn. Sử dụng tail -f file | less -Skhông hoàn hảo vì nó dường như vô hiệu hóa -fnhưng nó là giải pháp tốt nhất tôi tìm thấy.
nunaxe

Câu trả lời của @Boris Marcos có lẽ tốt hơn. Nó sử dụng lesstrực tiếp.
AnthonyD973

51

Thử:

less -S +F filename

  • Nhấn Ctrlcđể dừng đuôi và bây giờ Bạn có thể di chuyển sang trái và phải bằng các phím con trỏ.
  • Nhấn Shiftfđể tiếp tục tailing
  • Nhấn Ctrlc, qđể thoát

Điều đó thật tuyệt! Đã có thiết bị đầu cuối của tôi trải dài hai màn hình, nhưng vì tôi đọc cái này ngày hôm qua nên tôi chỉ chuyển đầu ra rộng ra less -S. Cũng rất hữu ích trên máy tính xách tay.
Jonatan Öström


15

Giả sử bạn có COLUMNSbiến được xác định, bạn có thể thực thi

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

mặt khác thay thế $COLUMNSbằng chiều rộng cột của thiết bị đầu cuối, như thu được bởi stty -a.


2
Một cách khác để $COLUMNS(không được cập nhật ngay lập tức SIGWINCH, chỉ trên dấu nhắc tiếp theo) và stty -a(khó sử dụng hơn trong tập lệnh) là tput cols.
manatwork

Cảm ơn enzotib. Điều đó hoạt động, nhưng nó cắt ngang dòng và chúng ta không thể thấy sự kết thúc của dòng dài. Có thể thực hiện cuthành vi giống như less -Snơi đường dài được đệm và chúng ta có thể thấy đường hoàn chỉnh bằng các phím điều hướng?
nunaxe

Uhm, không đơn giản. Tôi đang nghĩ về các giải pháp có dây, ví dụ như hai screencửa sổ riêng biệt với mỗi tail -f | cuthoặc một tập lệnh mô phỏng theo một cách nào đó lesshành vi. Nhưng hiện tại không có giải pháp.
enzotib

1
Lưu ý phụ: cắt chỉ đếm byte; Không giống như less -S, nó sẽ làm hỏng văn bản màu hoặc bất cứ thứ gì có ANSI thoát. Có thể làm hỏng Unicode quá.
ELLIOTTCABLE

Vâng, less -Shữu ích hơn với văn bản màu. Bạn có thể sử dụng less -S -Eđể thoát ngay lập tức - hữu ích để cắt đầu ra màu ở mức $ COLUMNS.
xanh

4

Bạn có thể vô hiệu hóa ngắt dòng cho less, tailvà tất cả các lệnh khác dưới ánh mặt trời Linux với:

tput rmam

Để khôi phục sử dụng gói dòng:

tput smam

3

Trình giả lập thiết bị đầu cuối terminator (http://software.jessies.org/terminator/) cho phép không bao bọc các dòng dài và có cuộn ngang (nhưng được viết bằng Java).


Làm thế nào để tôi kích hoạt nó? Nó dường như không hoạt động theo mặc định.
defhlt

Theo văn bản này, cuộn ngang được bật theo mặc định. Tuyệt vời, đề xuất đa nền tảng. Cảm ơn!
dùng7089

Vui lòng làm cho câu trả lời này tốt hơn bằng cách hiển thị cách người ta sẽ kích hoạt tính năng này. Tôi đã tìm kiếm trong Tùy chọn và dường như không thể tìm thấy tùy chọn này. FWIW, tôi đang chạy terminator v1.91.
AnthonyK

2
@AnthonyK Có hai trình giả lập thiết bị đầu cuối không liên quan chia sẻ tên terminator, cái này mà gentledevil đang đề cập đến và cái mà bạn đang sử dụng.
jlliagre

3

Hai câu trả lời hay / ví dụ ở đây

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)

Một cảnh báo: ít nhất là trên thiết bị đầu cuối tích hợp trên máy cắt Mac của tôi dường như không xử lý tốt các ký tự tab. Có vẻ như nó hiển thị chúng với ví dụ 8 không gian nhưng chỉ tính toán chúng là 4 không gian rộng hoặc đại loại như thế. Nói cách khác, nếu thiết bị đầu cuối của bạn rộng 80 ký tự và đầu ra của bạn chứa một số tab trên mỗi dòng, bạn phải đặt chiều rộng thành có thể là 60 hoặc đại loại như thế. YMMV.


2

Sử dụng các tùy chọn dưới đây với less. Nó sẽ vô hiệu hóa gói từ và giữ màu văn bản, nếu được chỉ định.

less -SR +F filename


2

Có một vài ví dụ trên trang này đuôi ống với -f ... từ các thử nghiệm của tôi, nó không hoạt động chính xác, nếu bạn thực sự cần đường ống (ví dụ: nếu bạn cần thêm một cái gì đó, như grep), bạn có thể sử dụng một cái gì đó như :

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

không phải là tốt nhất cho hiệu suất có thể nhưng hoạt động ... khác nếu không yêu cầu thêm pipping, bạn có thể sử dụng một cái gì đó khác nhau như:

less -S +F file.log

2

Có rất nhiều ý kiến ​​đi lạc từ câu hỏi. Câu hỏi của OP là

Nhưng bây giờ tôi cần sử dụng tail -f, và nó cũng kết thúc tốt đẹp đầu ra. Có thể vô hiệu hóa dòng bọc trong vỏ bash cho tất cả các lệnh?

Một số ý kiến ​​đã được thực hiện về tính năng autowrap, nói rằng không phải tất cả các thiết bị đầu cuối đều có nó. Có lẽ. Nhưng (ngoài terminator , người phát triển tài liệu không có mô tả thiết bị đầu cuối ), tất cả các ví dụ được đưa ra là xterm, rxvt và một số giống nhau hoặc hậu duệ. Những điều đó đều liên quan.

Các +awtùy chọn trong xtermtương ứng với autoWraptài nguyên. Tư vấn hướng dẫn, nó nói rằng

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

và trong Trình tự điều khiển XTerm, nó nói

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

mà chắc chắn không "phụ thuộc vào lựa chọn thiết bị đầu cuối của bạn", vì bất kỳ thiết bị đầu cuối nào có khả năng tương thích VT100 đều hỗ trợ tính năng này. xterm và rxvt làm điều này, ví dụ. Những người khác cũng làm như vậy.

Liệu tính năng này có hữu ích với OP hay không. Việc ngăn chặn đường bao chỉ là một khía cạnh của vấn đề:

  • Shell biết chiều rộng của terminal terminal nhưng có thể bị ghi đè bằng cách đặt thành COLUMNSgiá trị "lớn".
  • Tất nhiên, điều đó có nghĩa là các ứng dụng sẽ dành nhiều thời gian để viết ở lề phải (và một số, bị sai, dù sao cũng sẽ bắt đầu một dòng mới).
  • OP có thể giả định rằng ứng dụng sẽ cuộn sang trái / phải để làm cho thiết bị đầu cuối rộng có thể sử dụng được. (terminator thực hiện điều này - một phần - nhưng các nhược điểm khác của nó sẽ loại bỏ điều đó, ngoại trừ những người chỉ sử dụng thiết bị đầu cuối để cat'đăng nhập vào màn hình).
  • những gì OP thực sự đang tìm kiếm là một bộ công cụ có thể được yêu cầu vô hiệu hóa tính năng ngắt dòng, đặc biệt là để xem logfiles. Nếu thiết bị đầu cuối hoạt động đủ tốt để sử dụng chung, điều đó không liên quan đến việc lựa chọn công cụ mà người ta sử dụng trong thiết bị đầu cuối.

Có máy nhắn tin có thể làm những gì cần thiết, ví dụ như, multitail trong đó liệt kê trong các tính năng của nó

Có thể tắt ngắt dòng, sau đó người ta có thể cuộn sang trái / phải bằng các phím con trỏ

Là dựa trên ncurses, nó sẽ hoạt động trên bất kỳ thiết bị đầu cuối được trích dẫn.


1

vi

bên trong loại vi

:set nowrap

Tôi tin rằng cũng có một plugin cho vi sẽ cung cấp cho bạn đuôi như hành vi.


-1

Nếu bạn thực sự muốn xem các dòng đầy đủ, bạn có thể sao chép và dán văn bản vào trình soạn thảo văn bản như Atom hoặc Notepad ++ và vô hiệu hóa kết thúc dòng trong đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.