doveadmとjqコマンドを組み合わせて使用率の値だけを取り出す

doveadmとjqコマンドを組み合わせて既定パーセントを超えているユーザを一覧化する、というスクリプトを考えた

前提として、LDAP連携時、1000件を超えるアドレスがある場合、doveadm quota get -A での一括取得ができない、という制約がある。

このため、ldapserchコマンドを使ってユーザ一覧を出力した上で個別に処理を行っていく必要がある。

doveadm quota get -u ユーザ名の通常出力は以下となる

[root@mail ~]# doveadm  quota get -u testuser2
Quota name Type    Value Limit                                                             %
User quota STORAGE     6    50                                                            12
User quota MESSAGE     8     -                                                             0
[root@mail ~]#

doveadmコマンドには-fオプションがあってフォーマットを変えられ、例えばdoveadm -f tab quota get -u ユーザ名を実行するとタブ区切りで処理するためタブが1個だけで表示される

[root@mail ~]# doveadm -f tab quota get -u testuser2
Quota name      Type    Value   Limit   %
User quota      STORAGE 6       50      12
User quota      MESSAGE 8       -       0
[root@mail ~]#

最近のLinuxならjqコマンドがインストールされているのでJSONで形式で出力することにする

[root@mail ~]# doveadm -f json quota get -u testuser2
[{"root":"User quota","type":"STORAGE","value":"6","limit":"50","percent":"12"},{"root":"User quota","type":"MESSAGE","value":"8","limit":"-","percent":"0"}][root@mail ~]#

これを単純にjqコマンドに通す

[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r
[
  {
    "root": "User quota",
    "type": "STORAGE",
    "value": "6",
    "limit": "50",
    "percent": "12"
  },
  {
    "root": "User quota",
    "type": "MESSAGE",
    "value": "8",
    "limit": "-",
    "percent": "0"
  }
]
[root@mail ~]#

今回は 容量のみ見るので「STORAGE」に関してだけ取得したい。この場合は「.[]」で1段階掘り下げた上で「|」でその下に対する処理を行い、「select」で条件にあうものを選択する、という処理を行う

[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select(.type =="STORAGE") '
{
  "root": "User quota",
  "type": "STORAGE",
  "value": "6",
  "limit": "50",
  "percent": "12"
}
[root@mail ~]#

selectは複数つなげられる、というのでpercentについても追加するも、90以上なら表示のところ、12なのに表示されている

[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select(.type =="STORAGE" and .percent>90 ) '
{
  "root": "User quota",
  "type": "STORAGE",
  "value": "6",
  "limit": "50",
  "percent": "12"
}
[root@mail ~]#

じゃあ、percentが12なら表示に変更してみるが、何も表示されない。

[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select( .percent == 12 ) '
[root@mail ~]#

文字列問題か?ということで、数値を「””」でくくってみると表示される

[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select( .percent == "12" ) '
{
  "root": "User quota",
  "type": "STORAGE",
  "value": "6",
  "limit": "50",
  "percent": "12"
}
[root@mail ~]#

jqコマンド処理内で、文字列として認識されているものを数値として認識させるのは「tonumber」を通す

[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select(.type =="STORAGE" and (.percent|tonumber) > 90 ) '
[root@mail ~]#

10より上なら表示に変更

[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select(.type =="STORAGE" and (.percent|tonumber) > 10 ) '
{
  "root": "User quota",
  "type": "STORAGE",
  "value": "6",
  "limit": "50",
  "percent": "12"
}
[root@mail ~]# 

で、percentの数値だけを出力させるには以下となる

[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '(.[] | select(.type =="STORAGE" and (.percent|tonumber) > 10 ) ).percent'
12
[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '(.[] | select(.type =="STORAGE" and (.percent|tonumber) > 90 ) ).percent'
[root@mail ~]#

これを環境変数で実行できるように修正を試みるがエラーとなる

[root@mail ~]# limitpercent=10
[root@mail ~]# username=testuser2
[root@mail ~]# doveadm -f json quota get -u $username | jq -r '(.[] | select(.type =="STORAGE" and (.percent|tonumber) > $limitpercent ) ).percent'
jq: error: $limitpercent is not defined at <top-level>, line 1:
(.[] | select(.type =="STORAGE" and (.percent|tonumber) > $limitpercent ) ).percent
jq: 1 compile error
[root@mail ~]#

jqコマンドの–argオプションを使って jqコマンド内部用の$limitpercentを設定する必要があった

[root@mail ~]# doveadm -f json quota get -u $username | jq --arg limitpercent 10 -r '(.[] | select(.type =="STORAGE" and (.percent|tonumber) > $limitper
cent ) ).percent'
[root@mail ~]#

今回も文字列数値問題があるようなのでtonumberを追加

[root@mail ~]# doveadm -f json quota get -u $username | jq --arg limitpercent $limitpercent -r '(.[] | select(.type =="STORAGE" and (.percent|tonumber) > ($limitpercent|tonumber) ) ).percent'
12
[root@mail ~]#

これで、使用率の値だけの取り出しが出来た。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

モバイルバージョンを終了