首先,英语不是我的语言。我会尽量让大家理解:-) 其次,我不是一个普通的 Linux 用户,我才刚刚开始。
我正在使用curl
网络聊天平台的 API 来获取我的团队的状态。每个成员都拥有一个ID
.对于每一个ID
,我将结果通过管道传输到一个文本文件中agent-#.txt
。因此,在我的文件夹中,如果我有 5 个成员,我会获得 5 个文件:agent-1.txt
,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
所有三个作为一个 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
一步。