쉘 스크립트에서 행과 열을 설정하는 방법

쉘 스크립트에서 행과 열을 설정하는 방법

방금 다른 사람의 도움을 받아 첫 번째 쉘 스크립트를 만들었고 예상대로 작동하지만 좀 더 정리하고 싶습니다.

현재 스크립트:

{ date '+%F %T';
    "$ipath"/cli iedge list |
       awk 'BEGIN { print "Registration ID", "Ongoing Calls"}
           /Registration ID/ { id = $3; next }
           /Ongoing Calls/ { print id,$3 }'
} >> "$ifile"

출력:

- Registration ID Ongoing Calls
  - Nitin_03 30
  - Nitin_01 0

대신 출력 형식을 다음과 같이 지정하고 싶습니다.

-------------------------------------
|Registration ID   |  Ongoing Calls |
-------------------------------------
| Nitin_03         |     30         |
-------------------------------------
| Nitin_01         |      0         |
------------------------------------- 

어떻게 해야 하나요? 다음을 시도했는데 대부분 작동하지만 다른 "문자"를 추가하면 치명적인 오류가 발생합니다.

ipath=/usr/local/nextone/bin
ifile=/root/Nick.csv
"$ipath"/cli igrp list | awk '
  BEGIN { print "------------------------------------";
  printf "|%-17s|%-16s|%-15s|\n","Iedge Group", "maxCallsIn"   
  "maxCallsOut"
  }
  /Iedge Group/ { id = $3; next }
  /maxCallsIn/
  /maxCallsOut/{print "------------------------------------"; printf    
   "|%-17s|%-16s|%-15s\n",id,$3 } 
   END{
   print "------------------------------------";
   }'

다음을 추가했을 때 이 오류가 발생하기 시작했습니다 maxCallsOut.

awk: cmd. line:3: fatal: not enough arguments to satisfy format string
        `|%-17s|%-16s|%-15s|
'
                         ^ ran out for this one

답변1

awk에서 형식화된 출력을 얻으려면 다음을 사용하십시오 printf.

$ "$ipath"/cli iedge list | awk 'BEGIN { print "------------------------------------"; printf "|%-17s|%-16s|\n","Registration ID", "Ongoing Calls"} /Registration ID/ { id = $3; next } /Ongoing Calls/ {print "------------------------------------"; printf "|%-17s|%-16s|\n",id,$3 } END{print "------------------------------------";}'
------------------------------------
|Registration ID  |Ongoing Calls   |
------------------------------------
|Nitin_03         |30              |
------------------------------------
|Nitin_01         |0               |
------------------------------------

읽기가 더 쉽다면 다음은 동일하지만 스크립트의 여러 줄에 걸쳐 분산되어 있습니다.

#!/bin/sh
"$ipath"/cli iedge list | awk '
BEGIN { print "------------------------------------";
        printf "|%-17s|%-16s|\n","Registration ID", "Ongoing Calls"
      }
/Registration ID/ { id = $3; next }
/Ongoing Calls/ {print "------------------------------------"; printf "|%-17s|%-16s|\n",id,$3 }
END{
    print "------------------------------------";
   }
'

printf보고서는 원하는 형식으로 조정할 수 있습니다.

관련 정보