일부 출력의 특정 열을 강조 표시하는 가장 좋은 방법을 찾으려고 노력 중입니다. 구체적으로 강조하려고합니다.6위%cpu
명령의 열(예:):
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu
내가 하나 찾았어철사여기에서는 색상 추가를 사용하는 것이 허용되는 비슷한 주제입니다 sed
. 이것이 내가 하고 싶은 일이지만 제대로 작동하지 않는 것 같습니다.
이것이 내가 지금까지 얻은 것입니다:
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head | sed -e $'s/ *[^ ]* /\033[1;33m&\033[0m/'
강조 표시됨첫 번째밝은 노란색 기둥. 여섯 번째 열을 얻도록 정규식을 작동시키려고 노력 중이지만 작동하지 않는 것 같습니다.
동일한 스크립트에서 하이라이트를 제외하고 동일한 작업을 수행합니다.7번컬럼(메모리). 그래서 이 문제를 더 쉽게 처리할 수 있는 방법이 있기를 바랍니다.
답변1
ps
내 Debian 9에는 다음 보고서(즉, ps --version
보고서) 가 있습니다 ps from procps-ng 3.3.12
. 설명서에는 다음과 같이 명시되어 있습니다.
이는
ps
형식 지정 코드와 다소 유사하게 작동하는 AIX 형식 설명자를 지원합니다. 예를 들어, 다음 명령을 사용하여 일반 기본 출력을 생성할 수 있습니다.printf(1)
printf(3)
ps -eo "%p %y %x %c"
이 구문을 사용할 때 형식에 임의의 문자열을 포함할 수 있다는 것이 밝혀졌습니다. AIX와 비 AIX 형식 설명자를 혼합하는 것은 일반적으로 작동하지 않으며 문제의 형식은 AIX로 완전히 변환할 수 없습니다(AIX는 pid
, ppid
, time
, user
, 및 를 tty
대체 하지만 대체는 아니라고 생각합니다 ). 다행스럽게도 AIX 또는 비AIX 형식 설명자를 각각 독립적으로 사용하여 여러 를 사용할 수 있습니다.%cpu
vsize
command
%mem
-o
-o
귀하의 경우 강조하려는 열( %cpu
)을 AIX 형식 디스크립터( )로 표현할 수 있습니다 %C
. 이렇게 하면 상대적으로 쉽게 강조할 수 있습니다.
ps -eo pid,ppid,time,user,tty -o $'\033[1;33m%C\033[0m ' -o %mem,vsize,command --sort -%cpu
노트
$'…'
나는 확장을 위해 Bash의 구문을 사용하며\033[1;33m
이와 유사한ps
문자열은 확장하지 않습니다. 또는$(printf '…')
이스케이프 시퀀스를 생성하는 데 사용할 수 있습니다.- 이 형식에는 강조 표시된 열을 다음 열과 구분하기 위한 후행 공백이 포함됩니다.
- 이 방법을 사용하면 여러 연속 열을 쉽게 강조 표시할 수 있습니다.
- 강조표시가 시작되는 열이 AIX 형식 디스크립터로 표시될 수 없는 경우 이전 열이 표시될 수 있습니다. 첫 번째 강조 표시된 열을 지정하는 형식 앞에 삽입하는 대신
\033[1;33m
이전 열을 지정하는 형식 끝에 삽입할 수 있습니다. \033[0m
마찬가지로 마지막으로 강조 표시된 열을 지정하는 형식의 끝에 삽입하는 대신 다음 열을 지정하는 형식 앞에 삽입할 수 있습니다.- 열 간에 색상을 전환해야 하고 어느 열도 AIX 형식 설명자로 표시할 수 없는 경우 올바른 이스케이프 시퀀스를 제공하는 것이 유일한 목적인 더미 열을 중간에 추가할 수 있습니다. 임의의 문자열을 삽입하려면 AIX 형식과 유사한 형식이 필요합니다. 그렇지 않으면
ps
문자열을 AIX가 아닌 형식으로 해석하려고 시도합니다(실패하지 않더라도 원하는 것은 아닙니다). 이는 제공한 형식의 확장 가능한 항목이 하나 이상 필요함을 의미합니다%?
(?
문자 그대로 여기에 있는 것이 아니라 와일드카드로).
다음 예에서는 가상 열을 사용하여 필수 열을 강조 표시합니다. "실제" 열은 AIX가 아닌 형식을 사용하여 설명됩니다(따라서 모두 AIX 형식 설명자로 대체될 수는 없지만 솔루션은 여전히 작동합니다). "색상 전환" 형식을 %%
알려주는 데 사용됩니다 . print . 따라서 (백스페이스)는 각 경우에 즉시 인쇄되며, 후속 출력은 필요하지 않은 것을 덮어씁니다 .ps
%%
ps
%
\b
%
ps -eo pid,ppid,time,user,tty -o $'%%\b\033[1;33m' -o %cpu -o $'%%\b\033[0m ' -o %mem,vsize,command --sort -%cpu
필요한 경우 끝에 더미 열을 넣을 수 있습니다. 이 경우 형식에는 여전히 후행 공백이 필요합니다(원치 않는 공백을 덮기 위해 %
).
마찬가지로 시각적 구분 기호를 생성할 수도 있습니다. 예:
ps -eo pid,ppid,time,user,tty -o $'%%\b|X| ' -o %cpu,%mem,vsize,command --sort -%cpu
이 경우 AIX 설명자를 사용하여 인접한 열을 지정할 수 있으므로 like를 사용하는 것이 더 쉽고 -o '%y |X| %C'
필요하지 않습니다 %%\b
. 그러나 일반적으로 이는 AIX 형식 설명자가 인접한 열을 표현할 수 없는 경우에도 사용자 정의 열을 생성하는 방법입니다.
- 출력을 추가로 구문 분석 하는
sed
경우 (예:\033[0m
%%\b
이 솔루션은 이식성이 없지만 코드가 다음보다 낫다는 것을 알았습니다.이 방법은 다음과 같습니다.sed
. 특히 서로 다른 열에 다양한 색상을 적용할 때 더욱 그렇습니다. 앞이나 가운데에 열을 추가하고 열을 제거하거나 재배열하는 것은 쉽습니다. sed
정규식을 주의 깊게 조정해야 합니다.
답변2
돈 크리스티매우 간단한 솔루션이 게시되었습니다. 마지막 닫는 따옴표 앞에 원하는 열 번호를 추가하면 됩니다.
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head | sed -e $'s/ *[^ ]* /\033[1;33m&\033[0m/6'