여러 줄을 에코 또는 인쇄로 정렬하는 방법

여러 줄을 에코 또는 인쇄로 정렬하는 방법

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자 (*)%-20s 너비의 필드에 문자열을 인쇄합니다 . 20자로 만들고 넘친 부분을 삭제합니다.%-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

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

관련 정보