printf 문자 채우기
프로세스가 실행 중인지 여부를 표시하기 위해 bash 셸 스크립트를 쓰고 있습니다.
지금까지 제가 알아낸 건
printf "%-50s %s\n" $PROC_NAME [UP]
이 코드는 다음과 같은 출력을 제공합니다.
JBoss [DOWN]
GlassFish [UP]
verylongprocessname [UP]
두 필드 사이의 간격을 '-' 또는 '*'로 채워서 읽기 쉽게 하고 싶습니다.어떻게 하면 필드의 정렬을 방해하지 않고 할 수 있을까요?
원하는 출력은 다음과 같습니다.
JBoss ------------------------------------------- [DOWN]
GlassFish --------------------------------------- [UP]
verylongprocessname ----------------------------- [UP]
순수 배쉬, 외부 유틸리티 없음
이 데모에서는 완전한 자리맞추기를 할 수 있지만, 오른쪽 줄의 너덜너덜한 선을 원할 경우 두 번째 문자열의 길이를 빼는 것을 생략할 수 있습니다.
pad=$(printf '%0.1s' "-"{1..60})
padlength=40
string2='bbbbbbb'
for string1 in a aa aaaa aaaaaaaa
do
printf '%s' "$string1"
printf '%*.*s' 0 $((padlength - ${#string1} - ${#string2} )) "$pad"
printf '%s\n' "$string2"
string2=${string2:1}
done
패드 끈의 , 그 보다 길어야 합니다.padlength
그러하다, 이 노래, 이 노래, 이 노래, 이 노래, 이 노래, 이 노래, 이 노래.그러나 첫 번째 줄을 다음 세 줄로 대체하여 패드 길이에 대한 변수를 사용할 수 있습니다.
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
패드드드((padlimit
★★★★★★★★★★★★★★★★★」padlength
에 할 수 .$COLUMNS
긴 또는 가장 긴 데이터 문자열의 길이로 계산됩니다.
출력:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
두 번째 문자열의 길이를 빼지 않고 다음을 수행합니다.
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
첫 번째 행이 될 수 행이 될 수 있습니다).sprintf
printf -v pad '%0.1s' "-"{1..60}
또는 보다 동적인 기술에 대해서도 마찬가지입니다.
printf -v pad '%*s' "$padlimit"
할 필요 문자의 "를 사용할 수 있습니다.).1
★★★★★★★★★★★★★★★★★★★★★」에는 '있다'가합니다.$_1
,$_2
설정되지 않았거나 비어 있습니다.
printf -v pad '%s' "<>"$_{1..60}
필요에 따라서, 모든 인쇄를 1 행으로 실시할 수 있습니다.
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"
순수한 배쉬.고정 문자열 'line'의 오프셋으로 'PROC_NAME' 값의 길이를 사용합니다.
line='----------------------------------------'
PROC_NAME='abc'
printf "%s %s [UP]\n" $PROC_NAME "${line:${#PROC_NAME}}"
PROC_NAME='abcdef'
printf "%s %s [UP]\n" $PROC_NAME "${line:${#PROC_NAME}}"
이것으로 알 수 있다.
abc ------------------------------------- [UP]
abcdef ---------------------------------- [UP]
간단한(그러나 기능하는) 솔루션:
echo -e "---------------------------- [UP]\r$PROC_NAME "
이것이 가장 간단한 해결책이라고 생각합니다.순수 쉘 내장, 인라인 연산 없음.이전 답변에서 차용한 것입니다.
그냥 서브스트링이랑 ${#...} 메타데이터
A="[>---------------------<]";
# Strip excess padding from the right
#
B="A very long header"; echo "${A:0:-${#B}} $B"
B="shrt hdr" ; echo "${A:0:-${#B}} $B"
생산하다
[>----- A very long header
[>--------------- shrt hdr
# Strip excess padding from the left
#
B="A very long header"; echo "${A:${#B}} $B"
B="shrt hdr" ; echo "${A:${#B}} $B"
생산하다
-----<] A very long header
---------------<] shrt hdr
심플하지만 동작합니다.
printf "%-50s%s\n" "$PROC_NAME~" "~[$STATUS]" | tr ' ~' '- '
사용 예:
while read PROC_NAME STATUS; do
printf "%-50s%s\n" "$PROC_NAME~" "~[$STATUS]" | tr ' ~' '- '
done << EOT
JBoss DOWN
GlassFish UP
VeryLongProcessName UP
EOT
stdout 출력:
JBoss -------------------------------------------- [DOWN]
GlassFish ---------------------------------------- [UP]
VeryLongProcessName ------------------------------ [UP]
printf
를 사용할 수 있습니다.sed
:
printf "%-50s@%s\n" $PROC_NAME [UP] | sed -e 's/ /-/g' -e 's/@/ /' -e 's/-/ /'
echo -n "$PROC_NAME $(printf '\055%.0s' {1..40})" | head -c 40 ; echo -n " [UP]"
설명:
printf '\055%.0s' {1..40}
의 대시 - 40개의 대시 생성
를 대신"$PROC_NAME ..."
$- $PROC_NAME| head -c 40
. - 40자로 자릅니다.
이 명령어는 더 단순하고 외부 명령어는 실행하지 않습니다.
$ PROC_NAME="JBoss"
$ PROC_STATUS="UP"
$ printf "%-.20s [%s]\n" "${PROC_NAME}................................" "$PROC_STATUS"
JBoss............... [UP]
를 사용합니다.echo
@Dennis Williamson의 anwser는 정상적으로 동작하고 있습니다.단, 에코를 사용하여 이 작업을 수행하려고 했습니다.에코를 사용하면 특정 색상의 문자를 출력할 수 있습니다.를 사용하면 수 없는됩니다. 여기 있어요.echo
- alternative - 대체:
string1=abc
string2=123456
echo -en "$string1 "
for ((i=0; i< (25 - ${#string1}); i++)){ echo -n "-"; }
echo -e " $string2"
출력:
abc ---------------------- 123456
@은 모두 할 수 을 왼쪽 하는 것).25 - ${#string1}
타타에 25 - ${#string1} - ${#string2}
syslog...
여기 또 있습니다.
$ { echo JBoss DOWN; echo GlassFish UP; } | while read PROC STATUS; do echo -n "$PROC "; printf "%$((48-${#PROC}))s " | tr ' ' -; echo " [$STATUS]"; done
JBoss -------------------------------------------- [DOWN]
GlassFish ---------------------------------------- [UP]
컬럼 는, 와 「 」를 할 수 .cut
★★★★
# Previously defined:
# PROC_NAME
# PROC_STATUS
PAD="--------------------------------------------------"
LINE=$(printf "%s %s" "$PROC_NAME" "$PAD" | cut -c 1-${#PAD})
printf "%s %s\n" "$LINE" "$PROC_STATUS"
자동 스케일링/사이징 방법 및 예시로 콘솔 스팬/필/패드/패딩이 간단함.
function create-console-spanner() {
# 1: left-side-text, 2: right-side-text
local spanner="";
eval printf -v spanner \'"%0.1s"\' "-"{1..$[$(tput cols)- 2 - ${#1} - ${#2}]}
printf "%s %s %s" "$1" "$spanner" "$2";
}
예: create-console-spanner "loading graphics module" "[success]"
스패너로 컬러와 스타일의 포맷된 문자열을 인쇄하는 모든 작업을 수행하는 풀기능 컬러 문자 터미널 슈트입니다.
# Author: Triston J. Taylor <pc.wiz.tt@gmail.com>
# Date: Friday, October 19th, 2018
# License: OPEN-SOURCE/ANY (NO-PRODUCT-LIABILITY OR WARRANTIES)
# Title: paint.sh
# Description: color character terminal driver/controller/suite
declare -A PAINT=([none]=`tput sgr0` [bold]=`tput bold` [black]=`tput setaf 0` [red]=`tput setaf 1` [green]=`tput setaf 2` [yellow]=`tput setaf 3` [blue]=`tput setaf 4` [magenta]=`tput setaf 5` [cyan]=`tput setaf 6` [white]=`tput setaf 7`);
declare -i PAINT_ACTIVE=1;
function paint-replace() {
local contents=$(cat)
echo "${contents//$1/$2}"
}
source <(cat <<EOF
function paint-activate() {
echo "\$@" | $(for k in ${!PAINT[@]}; do echo -n paint-replace \"\&$k\;\" \"\${PAINT[$k]}\" \|; done) cat;
}
EOF
)
source <(cat <<EOF
function paint-deactivate(){
echo "\$@" | $(for k in ${!PAINT[@]}; do echo -n paint-replace \"\&$k\;\" \"\" \|; done) cat;
}
EOF
)
function paint-get-spanner() {
(( $# == 0 )) && set -- - 0;
declare -i l=$(( `tput cols` - ${2}))
eval printf \'"%0.1s"\' "${1:0:1}"{1..$l}
}
function paint-span() {
local left_format=$1 right_format=$3
local left_length=$(paint-format -l "$left_format") right_length=$(paint-format -l "$right_format")
paint-format "$left_format";
paint-get-spanner "$2" $(( left_length + right_length));
paint-format "$right_format";
}
function paint-format() {
local VAR="" OPTIONS='';
local -i MODE=0 PRINT_FILE=0 PRINT_VAR=1 PRINT_SIZE=2;
while [[ "${1:0:2}" =~ ^-[vl]$ ]]; do
if [[ "$1" == "-v" ]]; then OPTIONS=" -v $2"; MODE=$PRINT_VAR; shift 2; continue; fi;
if [[ "$1" == "-l" ]]; then OPTIONS=" -v VAR"; MODE=$PRINT_SIZE; shift 1; continue; fi;
done;
OPTIONS+=" --"
local format="$1"; shift;
if (( MODE != PRINT_SIZE && PAINT_ACTIVE )); then
format=$(paint-activate "$format&none;")
else
format=$(paint-deactivate "$format")
fi
printf $OPTIONS "${format}" "$@";
(( MODE == PRINT_SIZE )) && printf "%i\n" "${#VAR}" || true;
}
function paint-show-pallette() {
local -i PAINT_ACTIVE=1
paint-format "Normal: &red;red &green;green &blue;blue &magenta;magenta &yellow;yellow &cyan;cyan &white;white &black;black\n";
paint-format " Bold: &bold;&red;red &green;green &blue;blue &magenta;magenta &yellow;yellow &cyan;cyan &white;white &black;black\n";
}
색상을 인쇄하는 방법은 다음과 같습니다.paint-format "&red;This is %s\n" red
나중에 과감하게 것 같아요.paint-format "&bold;%s!\n" WOW
-l
옵 paint-format
function은 콘솔 글꼴메트릭 조작을 실행할 수 있도록 텍스트를 측정합니다.
-v
옵 paint-format
는 능은와 function function function function function function function function function function function function the the the 와 동일하게 합니다.printf
단, 공급은 할 수 있습니다.-l
이제 스패닝을 시작합시다!
paint-span "hello " . " &blue;world"
줄시퀀스는 차기 에 다음 줄주의: 줄 바꿈 단말 시퀀스는 추가하지 않았지만 텍스트가 단말기에 가득 차기 때문에 다음 줄은 줄 바꿈 단말 시퀀스일 뿐입니다]
그 결과는 다음과 같습니다.
hello ............................. world
매개 변수 확장을 허용하려면 Bash + seq
@의 응답과, @Dennis Williamson이 @Dennis Williamson의 일 경우seq
사용할 수 있으므로 패드 문자열의 길이를 하드 코딩할 필요가 없습니다.다음 코드를 사용하면 변수를 위치 파라미터로 스크립트에 전달할 수 있습니다.
COLUMNS="${COLUMNS:=80}"
padlength="${1:-$COLUMNS}"
pad=$(printf '\x2D%.0s' $(seq "$padlength") )
string2='bbbbbbb'
for string1 in a aa aaaa aaaaaaaa
do
printf '%s' "$string1"
printf '%*.*s' 0 $(("$padlength" - "${#string1}" - "${#string2}" )) "$pad"
printf '%s\n' "$string2"
string2=${string2:1}
done
셸이 명령 플래그로 해석하지 않도록 문자 "-" 대신 ASCII 코드 "2D"가 사용됩니다.또 다른 옵션은 "="를 사용하기 위한 "3D"입니다.
인수로 전달된 padlength가 없는 경우 위의 코드는 기본적으로 80자의 표준 단자 너비가 됩니다.
셸 bash를 COLUMNS
현재 단말기의 폭), 할 수 (예: 현재 단말기의 폭), 환경변수를 사용할 수 있습니다. 가지 은 모든 이 되는 으로써 환경변수의 근원이 되는 입니다..
명령어)는과 같습니다. ('점' 명령어')
. /path/to/script
좋은)COLUMNS
하다
/path/to/script $COLUMNS
언급URL : https://stackoverflow.com/questions/4409399/padding-characters-in-printf
'programing' 카테고리의 다른 글
함수 호출에서 **(이중 별/별표) 및 *(별/별표)는 무엇을 의미합니까? (0) | 2023.04.12 |
---|---|
심볼 링크가 있는지 확인하는 방법 (0) | 2023.04.12 |
콘텐츠에 맞게 UITextView 크기를 조정하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
Excel 연결 견적 (0) | 2023.04.12 |
SQL varchar(length)에서 고려해야 할 가장 긴 전 세계 전화번호는 무엇입니까? (0) | 2023.04.12 |