다양한 방법을 시도하고 있는 데이터가 있는데 그 결과는 다음과 같습니다.
[
"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
(?) 함수를 통해 각 하위 하위 배열을 키-값 쌍으로 변환합니다.jq
key
value
$ 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
그리고 :gron
Perl
$ gron file | perl -nE 'say $& if /created:.*OStype:\K\w+/'
Linux
또는 jq
및 GNU grep
:
$ jq '.[]' | grep -oP 'created:.*OStype:\K\w+'