Tự động cắt chiều rộng dòng stdout trong Bash


9

Gần đây, tôi đã thử nghiệm pslệnh này, và đôi khi các đường dẫn dài đến dòng tiếp theo (hoặc hai) và làm cho nó khó đọc. Tôi muốn chuyển psđầu ra sang một chương trình khác để giới hạn đầu ra ở xsố lượng ký tự.

Đây là những gì tôi có cho đến nay, nhưng nó không hoạt động hoàn toàn đúng:

ps aux | cut -c1-$(stty size | cut -d' ' -f2)

$(stty size | cut -d' ' -f2)ước tính là 167, nhưng dường như không phải là đầu vào hợp lệ cho cut.

Có cách nào để loại cú pháp này hoạt động trong bash không?


Công việc này cho tôi. Bạn có thể cung cấp một số đầu ra?
cuonglm

phần năng động ở đâu? Bạn muốn một chiều dài khác nhau cho các điều kiện nhất định? Có vẻ như bạn muốn giới hạn tất cả đầu ra ở một độ dài tối đa

@awk_FTW Tùy thuộc vào tình huống, tôi có các cài đặt cửa sổ khác nhau. Ở chế độ toàn màn hình, chiều rộng của tôi là 167. Nhưng ở các kích thước khác, tôi sẽ cần phải nhỏ hơn. Đó là lý do tại sao tôi muốn gọi ssty để có được kích thước.
đậu lăng

Hãy thửtput rmam; ps aux
Stéphane Chazelas

Một số vỏ như zsh, ksh93hoặc bashlưu trữ chiều rộng thiết bị đầu cuối trong$COLUMNS
Stéphane Chazelas

Câu trả lời:


5

Các công việc sau đây:

ps aux | cut -c1-$(stty size </dev/tty | cut -d' ' -f2)

Điều này cũng hoạt động:

v=$(stty size | cut -d' ' -f2) ; ps aux | cut -c1-$v

Vấn đề dường như là sttycần phải có tty trên đầu vào tiêu chuẩn của nó để hoạt động. Hai cách tiếp cận trên giải quyết điều đó.

Vẫn còn một lựa chọn khác. Mặc dù sttystdin và stdout đều được chuyển hướng trong các lệnh trên, nhưng thiết bị xuất chuẩn của nó không phải là: nó vẫn trỏ đến một thiết bị đầu cuối. Thật kỳ lạ, sttycũng sẽ hoạt động nếu nó được đưa ra stderr làm đầu vào của nó:

ps aux | cut -c1-$(stty size <&2 | cut -d' ' -f2)

Thật vậy, nó làm! Đây chính xác là những gì tôi đang tìm kiếm. Chỉ tò mò, tại sao bạn lại thêm tee tt ở cuối?
đậu lăng

@lentils Rất tiếc, teeđã được thêm khi tôi gỡ lỗi. Nó đã biến mất
John1024

<& 2 đề cập đến điều gì? Tôi chưa bao giờ thấy ký hiệu đó trước đây.
đậu lăng

@lentils Trong shell, các tệp được đánh số. Không đề cập đến đầu vào tiêu chuẩn, một đến đầu ra tiêu chuẩn và hai đến lỗi tiêu chuẩn. Biểu thức <&2có nghĩa là nhận đầu vào của bạn từ lỗi tiêu chuẩn.
John1024

1
sttylấy các cài đặt của thiết bị đầu cuối được mở trên stdin của nó (bạn làm stty < /dev/other-ttyđể có được các cài đặt của thiết bị đầu cuối khác). Vì vậy, không có gì lạ khi nó không hoạt động nếu stdin của nó là một đường ống hoặc <&2hoạt động.
Stéphane Chazelas

8

Một số vỏ thích zsh, bashhoặc mkshtự động thiết lập các $COLUMNSbiến với độ rộng của nhà ga, vì vậy bạn không cần phải gọi sttyđây.

Tất cả các triển khai của pstôi đã thử hỗ trợ cú pháp không chuẩn (loại BSD) đó tự truy vấn độ rộng của thiết bị đầu cuối. Tôi ngạc nhiên của bạn không. Tôi hy vọng nó sẽ xem xét nội dung của biến COLUMNS môi trường mặc dù.

Vì vậy, bạn có thể làm:

export COLUMNS; ps aux

Nếu không,

ps aux | cut -c"1-$COLUMNS"

Bạn cũng có thể nói với thiết bị đầu cuối của bạn không bọc dòng:

tput rmam
ps aux

4

Bạn cũng có thể xử lý psđầu ra tốt hơn một chút.

ps --width ${n:-$COLUMNS} ${opts} #set ps terminal width

ps -ww ${opts} #no word wrap

ps -o ${only_interesting_output} ${opts} #trim output

Điều đó sẽ cho psphép phân tích đầu ra của nó để thông số kỹ thuật của bạn khi cần thiết.

Tất nhiên, nếu bạn không bao bọc từ, tuy nhiên, sau đó bạn đã gặp phải vấn đề thiếu thông tin. Bạn có thực sự cần tất cả của nó cho tất cả các quy trình? Mở nó trong một máy nhắn tin nếu vậy:

ps ww ${opts} | $PAGER

Nếu không, chỉ định những gì bạn muốn xem:

ps -o args= -p $pid

Ngoài ra, bạn có thể thông báo rõ ràng psvề thiết bị đầu cuối của bạn --width:

man ps

...

w Sản lượng rộng. Sử dụng tùy chọn này hai lần cho chiều rộng không giới hạn.

-w Sản lượng rộng. Sử dụng tùy chọn này hai lần cho chiều rộng không giới hạn.

--width n Đặt chiều rộng màn hình.

Điều --widthnày hoạt động chính xác với thông số kỹ thuật được yêu cầu của bạn mà không cần phải liên quan đến bất kỳ bộ lọc bổ sung hoặc quy trình phụ trợ nào (có thể sẽ chỉ làm lộn xộn -auxđầu ra của bạn hơn nữa). $COLUMNSnhư được hiển thị ở trên và như Stephane chỉ ra, nó thậm chí sẽ hoạt động linh hoạt.

Có lẽ đáng chú ý, tuy nhiên, mà tôi tìm thấy người ta thường cố gắng thêm các loại bộ lọc cần thiết để họ có thể phục vụ một |pipethông qua một bộ lọc để đầu ra phân tích cú pháp mà cũng khá khả năng là không cần thiết. Tất nhiên, bởi những người tôi chủ yếu là tôi.

Các -output toán hạng tôi đề cập ở trên cho phép bạn lọc cột pshiển thị, và khi bạn thêm các =assigment thậm chí bạn có thể đặt tên cho cột như bạn xin vui lòng. Tôi rời khỏi sự phân công trống và trao cho nó một mục tiêu -process $pidnên sản lượng chỉ từ psở tất cả là $pidtên lệnh và nó argstại sự thỉnh nguyện. Và -ohầu như không làm trầy xước bề mặt về cách bạn có thể xác định những gì pssẽ hoặc sẽ không hiển thị. Đây là hướng tôi muốn giới thiệu, đặc biệt là thông qua:

man ps

... 

Để xem mọi quy trình trên hệ thống bằng cú pháp BSD:

ps ax

ps axu

Để in cây quy trình:

ps -ejH

ps axjf

Để có được thông tin về chủ đề:

ps -eLf

ps axms

Để có được thông tin bảo mật:

ps -eo euser,ruser,suser,fuser,f,comm,label

ps axZ

ps -eM

Để xem mọi quy trình đang chạy dưới dạng root (ID thực & hiệu quả) ở định dạng người dùng:

ps -U root -u root u

Để xem mọi quy trình với định dạng do người dùng xác định:

ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm

ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

ps -Ao pid,tt,user,fname,tmout,f,wchan

Chỉ in ID tiến trình của syslogd:

ps -C syslogd -o pid=

Chỉ in tên của PID 42:

ps -p 42 -o comm=

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.