내부를 감싸는 데이터 열 인쇄


2

로그에서 일부 모니터링 데이터를 인쇄하고 있습니다.

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 형식 a15

어떤 아이디어에 대해서도 미리 감사드립니다!


U & L에 오신 것을 환영합니다! 지금까지 뭐 해봤 어 ?
Archemar

@Archemar 귀하는 OP를 수행하는 간단한 방법이있는 것처럼 OP가 조금만 개선해야하지만 개인적으로는 적어도 예를 들어 의지하지 않고는 쉬운 방법을 생각할 수 없습니다 perl. 어쩌면 troff/ tbl할 수 있지만 꽤 모호합니다. 내 말은, 나는 마지막 열을
감싸기

마지막 크기의 크기를 확인하고, 제거하고, 많은 흰색과 다음 덩어리를 에코하고, 적절한 크기가 될 때까지 다시 제거해야합니다. 나는 이것이 비트 필요 @derobert 동의 awk/perl또는 sed프로그래밍.
Archemar

@Archemar 아시다시피, 이것은 스택 오버플로 가 아닙니다 . 프로그래머가 아닌 사람도 여기에 환영합니다. 따라서 OP는 프로그래밍 언어로 자동 줄 바꿈 (또는 기타) 알고리즘을 구현할 수 없습니다.
derobert

printf 숫자 설정에 대해 언급했지만 열로 덤벼 들었고 제안 된 랩 명령을 찾을 수 없었습니다. 또한 bash를 사용하고 있지만 Perl 또는 sed, awk 명령을 사용할 수 있습니다.
krmarshall87

답변:


2

마지막 열이기 때문에 작동하는 kluge는 다음과 같습니다.

  1. printf라인 (제외 모두의 첫 번째 부분 $failure의 간격을 포함) 없이 후미 라인.
  2. echo "$failure" | fold -s -w $desired_width | sed -e "2,\$s/^/$spacing/"

여기서 $desired_width의 너비 $failure열과 $ 간격 (제 등) 번째 라인을 정확한 지점에서 시작하는 공간이 많이. 같은 공간을 사용하여 이러한 공간을 쉽게 생성 할 수 있습니다 spacing=$(echo $'\t' | pr -Te71). 내가 올바르게 세면 71이 작동해야합니다 ...

이것은 fold줄 바꿈 을 수행 한 다음 sed두 번째 및 그 이후의 열에 간격 (정렬 용)을 추가 하여 작동 합니다. 인쇄 될 때 첫 번째 줄은 줄 바꾸기가 없기 때문에 다른 출력과 합쳐집니다.

이 작업을 올바르게 수행하려면 Perl에 여러 모듈 (예 : Text::ASCIITable, Text::SimpleTable) Text::TabularDisplay이 있어야합니다.


정크 테스트 만하면됩니다. 당신의 전문 지식에 감사드립니다!
krmarshall87

$ s가 무언가로 설정되어 있다고 가정합니까? 큰 따옴표가 변수를 평가하려고 할 때 sed 오류가 발생합니다. 작은 따옴표를 사용하면 간격 변수가 실패합니다. 나는 sed에 대해 알고 있지만 첫 번째 섹션에서 무슨 일이 일어나고 있는지 정확히 모른다. 2, $를 자르면 같은 결과가 나옵니까?
krmarshall87

@ krmarshall87 아! 미안, 나는 그 $를 탈출하지 못했습니다 ... 그것은 쉘 변수가 아니며 sed 구문의 일부입니다. (결정된). 나는 원래 간격 인라인으로 테스트하고 작은 따옴표를 사용했습니다.
derobert

1

아마도 이미 존재하는 것이 있지만 ...

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

0

거친 방법은 다음과 같이 다시 포맷 한 후입니다.

indent='                                                                      '
sed "s/.\{$((${#indent}+2)),$COLUMNS\} /&\n$indent /;P;D"

(명령에서 indent70 공백 == 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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.