まず、英語は私の言語ではありません。理解しやすくします:-) 第二に、私は通常のLinuxユーザーではなく、今始めました。
私はcurl
WebチャットプラットフォームのAPIを使用してチームのステータスを確認しています。各メンバーには1つの結果がありますID
。各メンバーについて、ID
結果をテキストファイルに送信しますagent-#.txt
。agent-1.txt
したがって、自分のフォルダに5人のメンバーがいる場合、5つのファイルが作成されますagent-2.txt
。
各ファイルには次の内容が含まれています。
{
"used": 0,
"last": "2018-06-01 15:25:55",
"presence": [],
"away": false,
"free": 3,
"last_utc": "2018-06-01 13:25:55",
"last_timezone": "Europe/Paris",
"online": true,
"offline": true
}
次に、sed
Iを使用して不要なデータを削除します。
sed -i -e '/{/d; /last/d; /presence/d; /last_utc/d; /last_timezone/d; /offline/d; /}/d; s/"//g; s/,//g; s/[ ]//g; /^\s*$/d' *
各ファイルについて以下を取得します。
used:#
away:false
free:#
online:true
ここでは#
、数値(エージェントで使用されているスロットの総数と利用可能なスロットの数)です。
いいですね。しかし、今このデータをマージして次のようにしたいと思います。
- 評価のあるメンバーの総数
online:true
- 無料および使用済みスロットの総数
理想的には、他のファイルに合計を出力するコマンドを探しています。しかし、プロセス全体を処理できるアイデア(コマンド、スクリプト全体)があれば興味があります!
答え1
変更されていないJSONファイルを使用して(実行前sed
)jq
:
オンラインユーザー:
jq -s 'map(select(.online))|length' agent-*.txt
無料スロット数:
jq -s '[.[].free]|add' agent-*.txt
使用されたスロット数:
jq -s '[.[].used]|add' agent-*.txt
3 つすべてが 1 つの JSON 文書として表示されます。
jq -s '{online: map(select(.online))|length, free: [.[].free]|add, used: [.[].used]|add}' agent-*.txt
上記と同じですが、数字しかありません。
jq -s '(map(select(.online))|length), ([.[].free]|add), ([.[].used]|add)' agent-*.txt
答え2
agent-*.txt
awkを介してファイルをリンクして処理できます。
-F :
フィールド区切り文字として列全体を使用することに注意してください。
不完全な例:
#!/bin/sh
awk -F : -f - agent-*.txt <<EOF
/^used:/{
used+=\$2;
}
/^online:true/{
online++;
}
END{
printf("used: %d\n", used);
printf("online: %d\n", online);
}
EOF
おそらく、一致する式を慎重に変更すると、このsed
手順をスキップできます。