jq 출력을 쉼표로 구분된 문자열로 연결합니다.

jq 출력을 쉼표로 구분된 문자열로 연결합니다.

이 출력이 있고 이를 프로메테우스와 유사한 형식으로 변환하고 싶습니다.황금빛 봄.

cat /tmp/wp-plugin.txt | jq .[]

{
  "name": "akismet",
  "status": "active",
  "update": "none",
  "version": "5.0"
}
{
  "name": "performance-lab",
  "status": "active",
  "update": "none",
  "version": "1.4.0"
}

내 목표는 JQ CLI 도구를 사용하여 이 효과를 얻는 것입니다.

wp_plugins{name="akismet",status="active",update="none",version="5.0"}0
wp_plugins{name="performance-lab",status="active",update="active",version="1.4.0"}1

답변1

사용 jq:

jq -r 'to_entries[] | .key as $k | .value | to_entries | map("\(.key)=\(.value|@json)") | "wp_plugins{\(join(","))}\($k)"' file

또는

jq -r 'to_entries[] | .key as $k | .value | to_entries | "wp_plugins{\(map("\(.key)=\(.value|@json)")|join(","))}\($k)"' file

이것은 원시 JSON 파일을 가져와서 먼저 사용합니다 to_entries. 키는 배열 인덱스가 되고 값은 실제 객체가 됩니다.

따옴표가 없는 키와 따옴표가 있는 값을 사용하여 쉼표로 구분된 키-값 목록을 생성하므로 =각 키와 값 사이에 핸들 .value(즉, 객체)이 필요합니다. to_entries이를 다시 전달하여 새로운 키와 값 목록을 얻습니다.

그런 다음 키와 값은 찾고 있는 형식으로 출력을 구성하는 문자열 생성자에 전달되어 wp_plugins{쉼표로 구분된 목록의 시작 부분에 문자열을 추가하고 }끝에 배열 인덱스를 추가합니다.

질문에 있는 데이터의 출력 제공(데이터가 처음 배열에 입력될 때):

wp_plugins{name="akismet",status="active",update="none",version="5.0"}0
wp_plugins{name="performance-lab",status="active",update="none",version="1.4.0"}1

0키가 아닌 경우 출력 줄 끝에 a를 사용하여 변형을 수정했습니다 .updateavailable1available

jq -r '
    to_entries[] |
    (if .value.update == "available" then 1 else 0 end) as $v |
    .value | to_entries |
    map("\(.key)=\(.value|@json)") | join(",") |
    "wp_plugins{\(.)}\($v)"' file

관련 정보