シェルスクリプトで行と列を設定する方法

シェルスクリプトで行と列を設定する方法

私は他の人の助けを借りて最初のシェルスクリプトを作成し、期待どおりに動作しますが、もう少し整理したいと思います。

現在のスクリプト:

{ 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レポートは任意の形式に調整できます。

関連情報