Linux에서 json 파일의 값을 얻는 방법

Linux에서 json 파일의 값을 얻는 방법

다양한 방법을 시도하고 있는 데이터가 있는데 그 결과는 다음과 같습니다.

[
"created:Alpha;DateCreated:12/12/2022;TicketNo:XXXX_XXX;ProductName:websphere;OStype:Linux"
]

Linux위에서 사용하려는 OS 유형을 얻으려고 노력하고 있지만 JQ성공하지 못했습니다. 어떤 제안이라도

감사해요

주권

답변1

입력을 처리하기 위해 pure를 사용하는 또 다른 방법은 다음과 같습니다 jq.

$ jq '.[] / ";" | reduce .[] as $item ({}; . + ($item / ":" | {(.[0]): (.[1])}))' file
{
  "created": "Alpha",
  "DateCreated": "12/12/2022",
  "TicketNo": "XXXX_XXX",
  "ProductName": "websphere",
  "OStype": "Linux"
}

그런 다음 필수 필드를 직접 추출할 수 있습니다.

jq -r '.[] / ";" | reduce .[] as $item ({}; . + ($item / ":" | {(.[0]): (.[1])})) | .OStype' file
Linux

답변2

데이터가 다음과 같으면 훨씬 쉽습니다.

[
  {
    "created": "Alpha",
    "DateCreated": "12/12/2022",
    "TicketNo": "XXXX_XXX",
    "ProductName": "websphere",
    "OStype": "Linux"
  }
]

여기에서 다음을 사용하여 OStype최상위 배열의 첫 번째 요소에 있는 키 값을 선택할 수 있습니다.jq

jq -r 'first.OStype'

그렇다면 데이터를 보다 관리하기 쉬운 형태로 변환하려면 어떻게 해야 할까요? 먼저 배열의 문자열을 세미콜론으로 분할한 다음 다시 콜론으로 분할합니다.

$ jq -r 'map(split(";"))' file
[
  [
    "created:Alpha",
    "DateCreated:12/12/2022",
    "TicketNo:XXXX_XXX",
    "ProductName:websphere",
    "OStype:Linux"
  ]
]
$ jq 'map(split(";")|map(split(":")))' file
[
  [
    [
      "created",
      "Alpha"
    ],
    [
      "DateCreated",
      "12/12/2022"
    ],
    [
      "TicketNo",
      "XXXX_XXX"
    ],
    [
      "ProductName",
      "websphere"
    ],
    [
      "OStype",
      "Linux"
    ]
  ]
]

그런 다음 첫 번째 요소를 로 지정하고 두 번째 요소를 로 지정하고 from_entries(?) 함수를 통해 각 하위 하위 배열을 키-값 쌍으로 변환합니다.jqkeyvalue

$ jq 'map(split(";")|map(split(":")) | map({key:.[0],value:.[1]})|from_entries)' file
[
  {
    "created": "Alpha",
    "DateCreated": "12/12/2022",
    "TicketNo": "XXXX_XXX",
    "ProductName": "websphere",
    "OStype": "Linux"
  }
]

jq그런 다음 여기에 있는 답변의 첫 번째 명령으로 파이프하거나 이미 있는 명령에 병합합니다.

$ jq -r 'map(split(";")|map(split(":")) | map({key:.[0],value:.[1]})|from_entries) | first.OStype' file
Linux

예, 이는 모든 데이터를 더 유용한 것으로 변환하려는 경우에 유용합니다(아마도 데이터에서 단일 값을 추출하는 것 이외의 다른 목적으로). 하지만 Linux모든 것을 보기 좋은 JSON 객체로 변환하지 않고 해당 문자열을 가져오고 싶다면 어떻게 해야 할까요? 위 목록의 목록을 호출하면 쉽게 이 작업을 수행할 수 있습니다 select(). 첫 번째 요소가 문자열인 하위 배열의 두 번째 요소를 선택하면 됩니다 OSType.

$ jq -r 'map(split(";")|map(split(":"))) | first[] | select(.[0] == "OStype")[1]' file
Linux

또는 이러한 문자열의 순서를 완전히 제어할 수 있고 찾고 있는 값이 다음과 같다는 것을 알고 있는 경우마지막키-값 쌍에는 문자열에 값이 있습니다. 즉, 모든 하위 하위 배열에서 해당 값을 찾을 필요가 없습니다.

$ jq -r 'map(split(";")|map(split(":"))) | first[-1][1]' file
Linux

OStype:또는 정규식을 사용하려면 문자열에서 다음 문자열을 캡처하세요.

$ jq -r 'map(capture("OStype:(?<OStype>[^;]+)")) | first.OStype' file
Linux

어쨌든 그렇게 하고 싶다면 jq.

답변3

단지 Perl:

$ perl -MJSON::XS -MFile::Slurp -E '
    my $json = read_file("json");
    $json = decode_json $json;
    $_ = $json->[0];
    s/.*OStype://;
    say
'

반품:

Linux

그리고gron그리고 GNU grep:

$ gron file | grep -oP 'created:.*OStype:\K\w+'
Linux

그리고 :gronPerl

$ gron file | perl -nE 'say $& if /created:.*OStype:\K\w+/'
Linux

또는 jqGNU grep:

$ jq '.[]' | grep -oP 'created:.*OStype:\K\w+'

관련 정보