echo 또는 print를 사용하여 여러 줄을 정렬하는 방법

echo 또는 print를 사용하여 여러 줄을 정렬하는 방법

fstab 아래에 나열된 항목을 기반으로 마운트된 파일 시스템을 확인하는 스크립트가 있습니다. 여기서 직면한 문제는 출력을 정렬된 상태로 유지하는 것입니다.

다음은 스크립트 출력입니다.

/  is mounted OK
/boot  is mounted OK
/was8  is mounted OK
/was8/slogs  is mounted OK
/was8/cluster  is mounted OK
/was8/working  is mounted OK
/was8/app  is mounted OK
/was8/tools  is mounted OK
/was8/plugin  is mounted OK
/was8/coreproduct  is mounted OK
...

선을 정렬된 상태로 유지하고 싶으므로 다음과 같아야 합니다.

/  is mounted                       OK
/boot  is mounted                   OK
/was8  is mounted                   OK
/was8/slogs  is mounted             OK
/was8/cluster  is mounted           OK
/was8/working  is mounted           OK
/was8/app  is mounted               OK
/was8/tools  is mounted             OK
/was8/plugin  is mounted            OK
/was8/coreproduct  is mounted       OK
...

컬럼과 xargs를 시도했지만 원하는 결과를 얻을 수 없습니다. 누군가 나를 도와주세요.

답변1

일반적으로 인쇄할 때 형식 문자열의 너비를 printf. 문자열은 오버플로되지 않는 한 20자 (*) 너비의 필드에 인쇄됩니다 . %-20s20자로 만들고 오버플로를 제거합니다.%-20.20s

(* 예를 들어 Bash는 printf실제로 중요하지만바이트. 차이점은 UTF-8과 같은 문자를 통해 확인할 수 있습니다 ä. )

예를 들어

printf "%-40s %s\n" "$mountpoint  is mounted" "$status"

첫 번째 부분의 너비는 (적어도) 40자입니다.

/was8/coreproduct  is mounted            OK
...

또는 이러한 입력을 사후 처리해야 하는 경우 Perl 또는 awk를 사용할 수 있습니다.

perl -pe 's/(.*) +(\S+)$/ sprintf "%-40s %s", $1, $2 /e'  < file

awk '{s=$NF; sub(/ *[^ ]+ *$/, "", $0); printf "%-40s %s\n", $0, s}'  < file

둘 다 기본적으로 공백이 아닌 마지막 문자열을 분리한 다음 고정 너비 필드의 첫 번째 부분과 함께 두 부분을 인쇄합니다.


또는 필드 간의 구분을 정확히 동일하게 유지하는 데 신경 쓰지 않으면 @가 더 간단한 솔루션에 주석을 달았습니다.조아오할 것이다:

awk '{s=$NF; NF-- ; printf "%-40s %s\n", $0, s}' < file

그러면 다음과 같은 출력이 생성됩니다. 이전 두 공간이 is mounted하나로 축소되었습니다. 이는 awk필드가 수정될 때 전체 필드가 ​​다시 작성되기 때문에 발생합니다 .$0NF

/was8/coreproduct is mounted             OK

답변2

혼란스러운 Perl:

perl -ne 'printf "%-40s %s", /(.*) (.*)/s'

답변3

한 가지 방법은 상태 코드 앞에 탭을 추가하는 것입니다. 예를 들면 다음과 같습니다.

<input rev | sed 's/ /\t/' | rev | column -s $'\t' -t

산출:

/  is mounted                        OK
/boot  is mounted                    OK
/was8  is mounted                    OK
/was8/slogs  is mounted              OK
/was8/cluster  is mounted            OK
/was8/working  is mounted            OK
/was8/app  is mounted                OK
/was8/tools  is mounted              OK
/was8/plugin  is mounted             OK
/was8/coreproduct  is mounted        OK
/was8/ihs  is mounted                OK
/was8/backup  is mounted             OK
/was8/ihs/logs  is mounted           OK
/was8/wsdm  is mounted               OK
/was8/ws  is mounted                 OK
/was8/ihs/logs/analysis  is mounted  OK

답변4

이는 컬럼 유틸리티를 사용하여 쉽게 수행할 수도 있습니다. 핵심은 "열" 사이에 일종의 구별 표시를 포함하는 것입니다. 예를 들어 공간이 구별되는 표시라면 column -s ' ' -o ' ' -t공간적으로 완벽하게 정렬됩니다.

나는 그것을 많이 사용하고 심지어 내 코드를 정렬하는 데 사용하는 멋진 vim 매크로를 만들었습니다. 원하는 일반 구문은 다음과 같습니다.

column -s <Separator String> -o <Separator String in Output> -t

이는 탭 기반 답변을 일반화한 것이지만 반드시 탭을 삽입할 필요는 없습니다.

관련 정보