bash 변수를 JSON 키로 추가하고 값을 객체에 추가합니다.

bash 변수를 JSON 키로 추가하고 값을 객체에 추가합니다.

나는 이와 같은 객체의 JSON 배열을 가지고 있습니다.

[
  {
    "id" : "tmp1387816934708382026",
    "owner" : "john",
    "x11-display" : ":5",
    "x11-authority" : "/run/user/john/dcv/tmp1387816934708382026.xauth",
    "num-of-connections" : 1,
    "creation-time" : "2019-05-14T14:12:14.989287Z",
    "last-disconnection-time" : "2019-05-31T18:58:42.851223Z"
  },
  {
    "id" : "tmp4241942441012516520",
    "owner" : "mike",
    "x11-display" : ":10",
    "x11-authority" : "/run/user/mike/dcv/tmp4241942441012516520.xauth",
    "num-of-connections" : 0,
    "creation-time" : "2019-05-17T16:23:05.891531Z",
    "last-disconnection-time" : "2019-05-19T11:23:30.844797Z"
  }
]

days-idleBash 스크립트 내에서 계산되는 각 개체에 값이 포함된 키를 추가해야 합니다 . 이것이 제가 각 JSON 객체에서 찾고 있는 것입니다.

{
    "id" : "tmp1387816934708382026",
    "owner" : "mike",
    "x11-display" : ":5",
    "x11-authority" : "/run/user/mike/dcv/tmp1387816934708382026.xauth",
    "num-of-connections" : 1,
    "creation-time" : "2019-05-14T14:12:14.989287Z",
    "last-disconnection-time" : "2019-05-31T18:58:42.851223Z",
    "days-idle" : "$daysIdle"
  }

키를 추가할 수 있다는 것을 알고 있지만 jq값이 bash 변수인 키, 값 쌍을 추가하는 방법을 확신하지 못했습니다.

답변1

.id특정 값을 가진 요소에 새 키를 추가한다고 가정하면 다음과 같습니다 $id.

jq --arg id "$id" --arg idle "$daysIdle" \
    '( .[] | select(.id == $id)."days-idle" ) |= $idle' file

.id수정하려는 배열 요소를 선택한 다음 추가합니다(실제로는업데이트) ."days-idle"우리가 원하는 특정 값을 가진 해당 요소의 키입니다.

타임스탬프와 타임스탬프 ."days-idle"사이의 시간이어야 하는 경우."last-disconnection-time"지금, 다음과 같이 JSON의 모든 요소를 ​​업데이트할 수 있습니다.

jq 'def dayssince: ((now - (sub("[.].*"; "Z") | fromdate))/86400) | round;
    map(. += { "days-idle": (."last-disconnection-time" | dayssince) })' file

호출 sub()은 점의 타임스탬프를 자르고 끝 부분을 Z. 이는 fromdate구문 분석할 수 있는 타임스탬프 유형이 약간 제한적 이며 원래 타임스탬프 문자열의 1초 미만 정밀도를 처리하지 못하기 때문입니다 .

코드를 깔끔하게 유지하기 위해 타임스탬프 이후의 일수에 대한 실제 계산을 이라는 함수에 넣기로 결정했습니다 jq.dayssince

결과 JSON(2021년 6월 28일 실행 시):

[
  {
    "id": "tmp1387816934708382026",
    "owner": "john",
    "x11-display": ":5",
    "x11-authority": "/run/user/john/dcv/tmp1387816934708382026.xauth",
    "num-of-connections": 1,
    "creation-time": "2019-05-14T14:12:14.989287Z",
    "last-disconnection-time": "2019-05-31T18:58:42.851223Z",
    "days-idle": 759
  },
  {
    "id": "tmp4241942441012516520",
    "owner": "mike",
    "x11-display": ":10",
    "x11-authority": "/run/user/mike/dcv/tmp4241942441012516520.xauth",
    "num-of-connections": 0,
    "creation-time": "2019-05-17T16:23:05.891531Z",
    "last-disconnection-time": "2019-05-19T11:23:30.844797Z",
    "days-idle": 771
  }
]

답변2

먼저 Bash 변수에 JSON 개체 배열이 있다고 가정하고 시작해 보겠습니다.

bash$ object='[
  {
    "id" : "tmp1387816934708382026",
    "owner" : "john",
    "x11-display" : ":5",
    "x11-authority" : "/run/user/john/dcv/tmp1387816934708382026.xauth",
    "num-of-connections" : 1,
    "creation-time" : "2019-05-14T14:12:14.989287Z",
    "last-disconnection-time" : "2019-05-31T18:58:42.851223Z"
  },
  {
    "id" : "tmp4241942441012516520",
    "owner" : "mike",
    "x11-display" : ":10",
    "x11-authority" : "/run/user/mike/dcv/tmp4241942441012516520.xauth",
    "num-of-connections" : 0,
    "creation-time" : "2019-05-17T16:23:05.891531Z",
    "last-disconnection-time" : "2019-05-19T11:23:30.844797Z"
  }
]'

$daysIdle다음으로, 이것도 변수이고 숫자를 포함한다고 가정하겠습니다 .

bash$ daysIdle=3

이제 해당 변수를 추가하기 위해 $object전체를 에코할 수 있습니다.jq

bash$ echo "$object" | jq --arg daysIdle "$daysIdle" '.[]."days-idle" = ($daysIdle | tonumber)'

이에 대한 몇 가지 중요한 참고 사항입니다. 객체가 실제로 파일에 있거나 cURL과 같은 다른 스트림에서 오는 경우 echo $object적절한 것을 바꾸십시오. 둘째, 일반적으로 생성되는 문자열이 아닌 JSON 숫자를 원한다고 가정하므로 --arg이를 수정하기 위한 필터가 있습니다. 마지막으로 값을 전달하기 --arg위해 옵션 을 사용한다는 점에 유의하세요 . jq이는 JSON 필터 문자열 자체에 값을 삽입하는 것보다 훨씬 더 좋고 안전하며 구문 오류가 발생하지 않습니다. 숫자로 변환할 수 없으면 오류가 발생하지만 필터 문자열에 임의 주입은 허용되지 않습니다. 그러면 출력을 살펴보겠습니다.

[
  {
    "id": "tmp1387816934708382026",
    "owner": "john",
    "x11-display": ":5",
    "x11-authority": "/run/user/john/dcv/tmp1387816934708382026.xauth",
    "num-of-connections": 1,
    "creation-time": "2019-05-14T14:12:14.989287Z",
    "last-disconnection-time": "2019-05-31T18:58:42.851223Z",
    "days-idle": 3
  },
  {
    "id": "tmp4241942441012516520",
    "owner": "mike",
    "x11-display": ":10",
    "x11-authority": "/run/user/mike/dcv/tmp4241942441012516520.xauth",
    "num-of-connections": 0,
    "creation-time": "2019-05-17T16:23:05.891531Z",
    "last-disconnection-time": "2019-05-19T11:23:30.844797Z",
    "days-idle": 3
  }
]

관련 정보