"db-unique-name"
찾는데 도움이 필요해요 lifecycle-state": "AVAILABLE"
.
cat db_systems.txt
"db-unique-name": "p00z5bj_iad2bj",
"db-workload": "OLTP",
"defined-tags": {},
"freeform-tags": {},
"id": "dfadfasfsadfasdfasdf",
"lifecycle-details": null,
"lifecycle-state": "AVAILABLE",
--
"db-unique-name": "p00u5bh_iad2bj",
"db-workload": "OLTP",
"defined-tags": {},
"freeform-tags": {},
"id": "asdfsadfasdfasfd",
"lifecycle-details": "Resource was terminated at the backend.",
"lifecycle-state": "FAILED",
--
"db-unique-name": "p00u5bh_iad2bj",
"db-workload": "OLTP",
"defined-tags": {},
"freeform-tags": {},
"id": "asdfasdfasdf",
"lifecycle-details": "Resource was terminated at the backend.",
"lifecycle-state": "FAILED",
enter code here
"db-unique-name"
를 기준으로 한 시도 값입니다 "lifecycle-state": "AVAILABLE"
. 팔로우하지만 잘못된 값을 제공합니다.
cat db_systems.txt | egrep -A -6 "lifecycle-state|AVAILABLE" | grep db-unique-name
"db-unique-name": "p00u5bh_iad2bj",
"db-unique-name": "p00u5bh_iad2bj",
나도 이것을 시도했지만 모두 나열되어 있습니다.
cat db_systems.txt | awk -F";" '{for(i=1;i<=NF;i++){if ($i ~ /AVAILABLE|db-unique-name/){print $1}}}' | grep db-unique-name
"db-unique-name": "p00z5bj_iad2bj",
"db-unique-name": "p00u5bh_iad2bj",
"db-unique-name": "p00u5bh_iad2bj",
답변1
GNU로 시도해 볼 수 있습니다 awk
.
awk -F',' 'BEGIN { RS = "--" } /"lifecycle-state": "AVAILABLE"/ { gsub("^[[:blank:]]*", "", $1); print $1 }' file
산출:
"db-unique-name":"p00z5bj_iad2bj"
답변2
jq
JSON 형식의 데이터를 처리하는 경우(스니펫은 다음과 같음) 이러한 유형의 데이터 작업에 매우 유용한 도구가 무엇인지 살펴봐야 합니다 .
데이터가 다음과 같다면
{
"db-unique-name": "p00z5bj_iad2bj",
"db-workload": "OLTP",
"defined-tags": {},
"freeform-tags": {},
"id": "dfadfasfsadfasdfasdf",
"lifecycle-details": null,
"lifecycle-state": "AVAILABLE"
}
{
"db-unique-name": "p00u5bh_iad2bj",
"db-workload": "OLTP",
"defined-tags": {},
"freeform-tags": {},
"id": "asdfsadfasdfasfd",
"lifecycle-details": "Resource was terminated at the backend.",
"lifecycle-state": "FAILED"
}
{
"db-unique-name": "p00u5bh_iad2bj",
"db-workload": "OLTP",
"defined-tags": {},
"freeform-tags": {},
"id": "asdfasdfasdf",
"lifecycle-details": "Resource was terminated at the backend.",
"lifecycle-state": "FAILED"
}
그래서 이 jq
진술은
jq 'select(."lifecycle-state" == "AVAILABLE") | ."db-unique-name" ' < db_systems.txt
출력됩니다
"p00z5bj_iad2bj"
그러나 파일이 실제로 제공한 예제와 유사하다면( --
구분 기호로 사용하고 {} 객체 표기법 없이) awk
해결 방법이 더 쉬울 수 있습니다. JSON이 아닌 데이터를 jq로 푸시하는 것은 약간 어렵습니다.
답변3
이 시도,
사용 grep
:
grep -B6 AVAILABLE file | grep db-unique-name
"db-unique-name": "p00z5bj_iad2bj",
B
행을 일치시키기 전에 NUM행 선행 컨텍스트를 인쇄합니다.
사용 awk
:
awk '{a[++i]=$0;}/AVAILABLE/{print a[NR-6];}' file
"db-unique-name": "p00z5bj_iad2bj",
답변4
먼저 배열을 생성하고( f[]
아래 참조) 각 요소 이름을 해당 값에 매핑하는 이 접근 방식을 사용하면 이름으로 각 필드에 액세스할 수 있으므로 복잡한 조건을 만들고 임의의 순서로 필드를 인쇄할 수 있습니다.
$ cat tst.awk
{
gsub(/^[[:space:]]*"|"?,[[:space:]]*$/,"")
tag = val = $0
sub(/".*$/,"",tag)
sub(/.*"/,"",val)
f[tag] = val
}
/^--/ { prt() }
END { prt() }
function prt() {
if ( f["lifecycle-state"] == "AVAILABLE" ) {
print f["db-unique-name"]
}
delete f
}
$ awk -f tst.awk file
p00z5bj_iad2bj
예를 들어:
$ cat tst.awk
BEGIN { OFS="," }
{
gsub(/^[[:space:]]*"|"?,[[:space:]]*$/,"")
tag = val = $0
sub(/".*$/,"",tag)
sub(/.*"/,"",val)
f[tag] = val
}
/^--/ { prt() }
END { prt() }
function prt() {
recNr++
if ( (f["lifecycle-state"] == "FAILED") || ( (f["db-unique-name"] ~ /bh/) && (f["db-workload"] == "OLTP") ) ) {
print recNr, f["lifecycle-details"], f["id"], f["db-unique-name"]
}
delete f
}
$ awk -f tst.awk file
2,Resource was terminated at the backend.,asdfsadfasdfasfd,p00u5bh_iad2bj
3,Resource was terminated at the backend.,asdfasdfasdf,p00u5bh_iad2bj