내부 줄 바꿈을 사용하여 데이터 열 인쇄

내부 줄 바꿈을 사용하여 데이터 열 인쇄

다음과 같이 로그에서 일부 모니터링 데이터를 인쇄합니다.

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

다음은 마지막 열이기 때문에 작동하는 크루거입니다.

  1. printf줄의 첫 번째 부분(다음을 $failure제외한 모든 부분)아니요후행 새 줄.
  2. 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"

관련 정보