우선 영어는 내 언어가 아니다. 이해하기 쉽도록 노력하겠습니다 :-) 둘째, 저는 일반 Linux 사용자가 아니며 이제 막 시작했습니다.
저는 curl
웹 채팅 플랫폼의 API를 사용하여 팀의 상태를 확인하고 있습니다. 각 구성원은 하나의 결과를 가지고 있습니다 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
세 가지 모두 하나의 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
단계를 건너뛸 수 있습니다.