다음과 같이 로그에서 일부 모니터링 데이터를 인쇄합니다.
printf " %10s %5s %25s %15s %15s %s${txtrst}\n" $date $time $metric $status $current_criticality "$failure"
정의된 길이가 없는 마지막 열을 경계 내에서 감싸기를 원합니다. 여기서 왼쪽은 명확하게 정의되고 오른쪽은 화면이 있는 위치(일반적인 줄 바꿈 위치)입니다. 길이를 정의하려고 시도했지만 해결되지 않았습니다.
현재 출력 예:
09/30/2015 14:39 execution (SUCCESS) SUCCESS
09/30/2015 14:34 execution (FAILED) ERROR Step 3: Match Failed Blah blah blah blah blah blah blah.
09/30/2015 14:34 execution (FAILED) SUCCESS Step 1: Match Failed Blah blah blah blah blah blah blah.
09/30/2015 14:34 round_trip (10.174) ERROR Step 1: Match Failed Blah blah blah blah blah blah blah.
09/30/2015 14:34 round_trip (10.174) SUCCESS Step 1: Match Failed Blah blah blah blah blah blah blah.
09/30/2015 13:30 round_trip (94.652) ERROR
09/30/2015 13:30 round_trip (94.652) SUCCESS
09/30/2015 13:19 round_trip (0.257) SUCCESS
09/30/2015 13:16 round_trip (110.012) ERROR
09/30/2015 13:16 round_trip (110.012) SUCCESS
나는 보고 싶다:
09/30/2015 14:39 execution (SUCCESS) SUCCESS
09/30/2015 14:34 execution (FAILED) ERROR Step 3: Match Failed
Blah blah blah blah
blah blah blah.
09/30/2015 14:34 execution (FAILED) SUCCESS Step 1: Match Failed
Blah blah blah blah
blah blah blah.
09/30/2015 14:34 round_trip (10.174) ERROR Step 1: Match Failed
Blah blah blah blah
blah blah blah.
09/30/2015 14:34 round_trip (10.174) SUCCESS Step 1: Match Failed
Blah blah blah blah
blah blah blah.
09/30/2015 13:30 round_trip (94.652) ERROR
09/30/2015 13:30 round_trip (94.652) SUCCESS
09/30/2015 13:19 round_trip (0.257) SUCCESS
09/30/2015 13:16 round_trip (110.012) ERROR
09/30/2015 13:16 round_trip (110.012) SUCCESS
SQL*PLUS의 열 형식 보고서와 매우 유사합니다: col $column format a15
어떤 아이디어라도 미리 감사드립니다!
답변1
다음은 마지막 열이기 때문에 작동하는 크루거입니다.
printf
줄의 첫 번째 부분(다음을$failure
제외한 모든 부분)아니요후행 새 줄.echo "$failure" | fold -s -w $desired_width | sed -e "2,\$s/^/$spacing/"
여기서 $desired_width
는 열의 너비 $failure
이고 $spacing은 두 번째 행(세 번째 행 등)이 올바른 위치에서 시작하도록 만드는 데 필요한 공간의 양입니다. 이와 같은 것을 사용하면 이러한 공간을 쉽게 생성할 수 있습니다 spacing=$(echo $'\t' | pr -Te71)
. 정확하게 계산하면 71이면 괜찮을텐데...
이는 fold
줄 바꿈을 수행한 다음 두 번째 및 후속 열에 간격(정렬을 위해)을 추가하여 sed
수행됩니다 . 인쇄할 때 첫 번째 줄은 다른 출력과 연결됩니다(개행 누락으로 인해).
이 작업을 올바른 방식으로 수행하려면 Perl에는 여러 모듈이 있습니다(예:Text::ASCIITable
,Text::SimpleTable
,Text::TabularDisplay
이것을 할 수 있어야 합니다.
답변2
어쩌면 이미 존재하는 것들이 있을 수도 있지만...
awk -v cols=$(tput cols) '
NR == 1 {
prefix = gensub(/^(([[:blank:]]*[^[:blank:]]+){5}).*/, "\\\\1", 1, $0)
prefix_width = length(prefix) + 2
diff = cols - prefix_width
}
NF == 5 { print; next }
{
prefix = substr($0, 0, prefix_width)
text = substr($0, prefix_width+1)
while (length(text) > diff) {
for (i=diff; i>0; i--) {
char = substr(text,i,1)
if (char == " " || char == "-") break
}
if (i == 0) i = diff # no spaces or hyphens, break mid-word
printf "%*s%s\n", prefix_width, prefix, substr(text,0,i);
text = substr(text,i+1)
prefix = ""
}
if (text) printf "%*s%s\n", prefix_width, prefix, text
}
' file
답변3
대략적인 방법은
indent=' '
sed "s/.\{$((${#indent}+2)),$COLUMNS\} /&\n$indent /;P;D"
( 명령 indent
에서 70개 공백 == 10 + 5 + 25 + 15 + 15 ) 그러나 사전 서식 지정이 더 좋습니다.printf
indent=' '
mapfile failure < <(fold -s -w $(($COLUMNS-${#indent}-1)) <<<"$failure")
printf "%10s%5s%25s%15s%15s" $date $time $metric $status $current_criticality
printf " %b$indent" "${failure[@]}\c"