Bash에서 stdout 선 너비를 동적으로 다듬기


9

최근에 나는 ps명령을 실험 해 왔으며 때로는 긴 경로가 다음 줄 (또는 두 줄)로 둘러싸여 읽기가 어렵습니다. ps출력을 x문자 수로 제한하기 위해 출력을 다른 프로그램으로 파이프하고 싶습니다 .

여기까지 내가 가진 것이 있지만 제대로 작동하지 않습니다.

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

$(stty size | cut -d' ' -f2)167로 평가되지만에 대한 유효한 입력이 아닌 것 같습니다 cut.

이 유형의 구문을 bash에서 작동시키는 방법이 있습니까?


이것은 나를 위해 일합니다. 당신은 약간의 출력을 제공 할 수 있습니까?
cuonglm

동적 부분은 어디에 있습니까? 특정 조건에 대해 다른 길이를 원하십니까? 모든 출력을 하나의 최대 길이로 제한하려는 것 같습니다

@awk_FTW 상황에 따라 다른 창 설정이 있습니다. 전체 화면에서 너비는 167입니다. 그러나 다른 크기에서는 더 작아야합니다. 그래서 크기를 얻기 위해 ssty를 호출하고 싶습니다.
렌즈 콩

시도tput rmam; ps aux
Stéphane Chazelas

쉘에 좋아 zsh, ksh93bash에 터미널 폭을 저장$COLUMNS
스테판 Chazelas가

답변:


5

다음과 같이 작동합니다.

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

이것은 또한 작동합니다 :

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

문제는 것 같다 stty필요가 기능하기 위해 표준 입력에서 청각 장애를 가지고. 위의 두 가지 접근 방식으로 해결할 수 있습니다.

또 다른 옵션이 있습니다. 동안 stty의 표준 입력과이 표준 출력 모두 위의 명령에 리디렉션, 그 표준 에러는되지 않습니다 : 그것은 여전히 터미널에 포인트. 이상하게도 stty입력으로 stderr이 주어지면 작동합니다.

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

실제로 그렇습니다! 이것은 내가 찾던 것입니다. 궁금한 점이 있는데 왜 마지막에 티 tt를 추가 했습니까?
렌즈 콩

@lentils 죄송합니다 tee. 디버깅 할 때 추가되었습니다. 이제 없어졌습니다.
John1024

<& 2는 무엇을 의미합니까? 나는 그 표기법을 본 적이 없다.
렌즈 콩

@lentils 셸에서 파일 번호가 지정됩니다. 0은 표준 입력, 1-표준 출력 및 2-표준 오류를 나타냅니다. 이 표현 <&2은 표준 오류에서 입력을 얻는 것을 의미합니다.
John1024

1
sttystdin에서 열린 터미널의 설정을 가져옵니다 ( stty < /dev/other-tty예를 들어 다른 터미널의 설정을 가져옵니다). 따라서 stdin이 파이프이거나 작동 하는 경우 작동 하지 않는 것이 이상 하지 않습니다 <&2.
Stéphane Chazelas

8

쉘에 좋아 zsh, bash또는 mksh자동으로 설정 $COLUMNS하면 호출 할 필요가 없습니다, 터미널의 폭 변수를 stty여기에.

ps내가 구현 한 모든 구현은 비표준 (BSD 유형) 구문 쿼리 자체를 터미널 너비로 지원하려고 시도했습니다. 나는 당신이하지 않는 것이 놀랍습니다. 그래도 COLUMNS 환경 변수 의 내용을 볼 것으로 기대합니다 .

그래서 당신은 할 수 있습니다 :

export COLUMNS; ps aux

그렇지 않은 경우

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

터미널에 줄 바꾸기를하지 말라고 명령 할 수도 있습니다.

tput rmam
ps aux

4

ps출력을 조금 더 잘 처리 할 수도 있습니다 .

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

ps -ww ${opts} #no word wrap

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

그것은 말할 것이다 ps필요에 따라 사양에 출력을 구문 분석 할 수 있습니다.

물론, 줄 바꿈을하지 않으면 정보가 누락되는 문제가 있습니다. 모든 프로세스에 실제로 모든 것이 필요합니까? 그렇다면 호출기에서 엽니 다.

ps ww ${opts} | $PAGER

그렇지 않은 경우보고 싶은 것을 지정하십시오.

ps -o args= -p $pid

또는 ps터미널을 명시 적으로 알릴 수 있습니다 --width.

man ps

...

w 넓은 출력. 폭이 무제한 인 경우이 옵션을 두 번 사용하십시오.

-w 넓은 출력. 폭이 무제한 인 경우이 옵션을 두 번 사용하십시오.

--width n 화면 너비를 설정하십시오.

--width것은 추가 필터 나 보조 프로세스를 수반하지 않고도 요구 사양을 정확히 작동 (가능성 만 어수선 할 -aux더 많은 출력). 그리고 함께 $COLUMNS위 그것을 밖으로 스테판 점으로 같이도 동적으로 작동합니다.

그러나 사람들이 종종 이러한 종류의 불필요한 필터를 추가하려고 시도하므로 다른 필터를 |pipe통해 출력을 구문 분석하여 불필요 할 가능성이 높은 것을 알 수 있습니다. 물론 사람들 은 주로 저를 의미 합니다.

-output은 내가 위에서 언급 열을 필터로 할 수 있습니다 피연산자 ps를 표시하고, 당신이 추가 할 때 =의 할당은 당신도 당신과 같이 열을하시기 바랍니다 이름을 지정할 수 있습니다. 할당을 비워두고 대상 -process를 전달 $pid하므로 명령 출력 과 호출 ps시 의 유일한 출력 만 있습니다. 그리고 표시하거나 표시하지 않을 내용 을 정의하는 방법의 표면을 거의 긁지 않습니다. 이것이 내가 특히 추천하는 방향입니다 :$pidargs-ops

man ps

... 

BSD 구문을 사용하여 시스템의 모든 프로세스를 보려면 :

ps ax

ps axu

프로세스 트리를 인쇄하려면

ps -ejH

ps axjf

스레드에 대한 정보를 얻으려면

ps -eLf

ps axms

보안 정보를 얻으려면 :

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

ps axZ

ps -eM

사용자 형식으로 루트 (실제 및 유효 ID)로 실행중인 모든 프로세스를 보려면 :

ps -U root -u root u

사용자 정의 형식의 모든 프로세스를 보려면

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

syslogd의 프로세스 ID 만 인쇄하십시오.

ps -C syslogd -o pid=

PID 42의 이름 만 인쇄하십시오.

ps -p 42 -o comm=

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.