CURL에서 데이터 가져오기, 병합 및 내보내기

CURL에서 데이터 가져오기, 병합 및 내보내기

우선 영어는 내 언어가 아니다. 이해하기 쉽도록 노력하겠습니다 :-) 둘째, 저는 일반 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
}

다음으로 sedI를 사용하여 원하지 않는 데이터를 제거합니다.

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

여기서 #는 숫자(에이전트에 사용된 총 슬롯 수 및 사용 가능한 슬롯 수)입니다.

좋습니다. 하지만 이제 이 데이터를 병합하여 다음을 얻고 싶습니다.

  1. 등급이 있는 총 회원 수online:true
  2. 무료 및 사용된 슬롯의 총 개수

이상적으로는 다른 파일에 총계를 출력하는 명령을 찾고 있습니다. 하지만 전체 프로세스를 처리할 수 있는 아이디어(명령, 전체 스크립트)가 있다면 관심이 있습니다!

답변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-*.txtawk를 통해 파일을 연결하고 처리 할 수 있습니다 .

-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단계를 건너뛸 수 있습니다.

관련 정보