sed
명령 출력에서 열을 강조 표시하는 데 사용 ps
하고 색상 코드를 하드코딩하면 제대로 작동합니다. 다만 색상이 동적으로 표현되어야 해서 변수로 옮겨서 sed 명령어에서 해당 변수를 참조하려고 해보았으나 전혀 동작하지 않는 것 같습니다.
# Works
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head | sed -e $'s/ *[^ ]* /\033[1;33m&\033[0m/6'
그러나 \033[1;33m
및를 \033[0m
변수로 이동하고 이를 명령에서 참조하면(여러 가지 방법) 전혀 작동하지 않습니다.
# None of the following work
fg_normal="\033[0m"
fg_yellow="\033[1;33m"
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head | sed -e $'s/ *[^ ]* /'$fg_yellow'&'$fg_normal'/6'
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head | sed -e $'s/ *[^ ]* /'"$fg_yellow"'&'"$fg_normal"'/6'
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head | sed -e $"s/ *[^ ]* /$fg_yellow&$fg_normal/6"
어떤 아이디어가 있나요?
답변1
당신이 사용할 수있는:
fg_normal=$(echo -e "\033[0m")
fg_yellow=$(echo -e "\033[1;33m")
또는 tput을 사용하십시오:
fg_normal=$(tput sgr0)
fg_yellow=$(tput setaf 3)
답변2
printf
s %b
지정자를 사용하여 올바른 백슬래시 이스케이프 시퀀스를 유지하면서 sed 명령을 조합 할 수 있습니다 .
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head |
sed -e "$(printf 's/ *[^ ]* /%b&%b/6' "$fg_yellow" "$fg_normal")"
답변3
이해해야 할 쉘의 기능 중 하나 $'...'
는 이스케이프 문자를 작성하는 것입니다. A $'\033'
는 진정한 탈출이다 ESC.
$' '
따라서 sed 명령 내부에서 이동해야 합니다.
sed -e $'s/ *[^ ]* /\033[1;33m&\033[0m/6'
실제 변수의 경우 다음을 사용합니다.
fg_normal=$'\033[0m'
fg_yellow=$'\033[1;33m'
이 간단한 변경을 통해 ( $'
지금은 필요하지 않음) 작동합니다(작은따옴표 안팎의 올바른 인용 관찰 ').
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu |
head -n 10 |
sed -e 's/ *[^ ]* /'"$fg_yellow"'&'"$fg_normal"'/6'