내 코드 출력에 적합한 열을 정의하려고 합니다. 문제는 열의 요소 중 하나가 비어 있거나 문자 제한을 초과하는 경우 후속 열 요소가 대체된다는 것입니다.
VULDB-ID LEVEL CVE TITLE
122215 LOW CVE-2015-9261 BusyBox up to 1.27.1 ZIP File decompress_gunzip.c null pointer dereference
119934 MEDIUM CVE-2018-1000517 BusyBox wget memory corruption
119917 MEDIUM CVE-2018-1000500 BusyBox SSL Certificate Validator certificate validation
96755 LOW CVE-2016-2147 BusyBox up to 1.24.x DHCP Client integer overflow
94808 MEDIUM null BusyBox up to 1.23.1/1.4.x cmdline arp_main IFNAME memory corruption
93993 MEDIUM CVE-2016-6301 BusyBox NTP Packet networking/ntpd.c recv_and_process_client_pkt resource management
나는 테이블을 출력하기 위해 다음 코드를 사용하고 있습니다
title=$(jq -r .entry.title result.json 2>/dev/null)
cve=$(jq -r .source.cve.id result.json 2>/dev/null)
id=$(jq -r .entry.id result.json 2>/dev/null)
level=$(jq -r .vulnerability.risk.name result.json 1> level.tmp 2> /dev/null)
paste <(tput smul; printf %s"VULDB-ID"; tput rmul) <(tput smul; printf %s"LEVEL"; tput rmul) <(tput smul; printf %s"CVE"; tput rmul;) <(echo) <(tput smul; printf %s"TITLE"; tput rmul)
paste <(echo "$id") <(echo) <(cat level.tmp) <(echo "$cve") <(echo "$title") | column -t -s "\"" -L
데이터는 다음 json 파일에서 추출됩니다.
{
"entry": {
"id": "122215",
"title": "BusyBox up to 1.27.1 ZIP File decompress_gunzip.c null pointer dereference",
"timestamp": {
"create": "1532670117",
"change": "1583845511"
}
},
"vulnerability": {
"risk": {
"value": "1",
"name": "low"
}
},
"advisory": {
"date": "1532556000"
},
"source": {
"cve": {
"id": "CVE-2015-9261"
}
}
},
{
"entry": {
"id": "119934",
"title": "BusyBox wget memory corruption",
"timestamp": {
"create": "1530081876",
"change": "1582365028"
}
},
"vulnerability": {
"risk": {
"value": "2",
"name": "medium"
}
},
"advisory": {
"date": "1529971200"
},
"source": {
"cve": {
"id": "CVE-2018-1000517"
}
}
},
{
"entry": {
"id": "119917",
"title": "BusyBox SSL Certificate Validator certificate validation",
"timestamp": {
"create": "1530080858",
"change": "1582358574"
}
},
"vulnerability": {
"risk": {
"value": "2",
"name": "medium"
}
},
"advisory": {
"date": "1529971200"
},
"source": {
"cve": {
"id": "CVE-2018-1000500"
}
}
},
{
"entry": {
"id": "96755",
"title": "BusyBox up to 1.24.x DHCP Client integer overflow",
"timestamp": {
"create": "1486665130",
"change": "1597250919"
}
},
"vulnerability": {
"risk": {
"value": "1",
"name": "low"
}
},
"advisory": {
"date": "1486598400"
},
"source": {
"cve": {
"id": "CVE-2016-2147"
}
}
},
{
"entry": {
"id": "94808",
"title": "BusyBox up to 1.23.1\/1.4.x cmdline arp_main IFNAME memory corruption",
"timestamp": {
"create": "1483348691",
"change": "1564047629"
}
},
"vulnerability": {
"risk": {
"value": "2",
"name": "medium"
}
},
"advisory": {
"date": "1483228800"
}
},
{
"entry": {
"id": "93993",
"title": "BusyBox NTP Packet networking\/ntpd.c recv_and_process_client_pkt resource management",
"timestamp": {
"create": "1481373506",
"change": "1561216351"
}
},
"vulnerability": {
"risk": {
"value": "1",
"name": "medium"
}
},
"advisory": {
"date": "1481241600"
},
"source": {
"cve": {
"id": "CVE-2016-6301"
}
}
},
이제 내 질문은
- 열을 직접 정의해야 합니까? 그렇다면 어떻게 해야 합니까?
- 누락된 열을 예쁘게 인쇄하는 더 간단하고 우아한 방법이 있나요?
답변1
괜찮아요, 해결책을 찾았어요. 아래와 같이 "탭"을 구분 기호로 사용하고 있습니다.
paste <(echo "$id") <(cat level.tmp) <(echo "$cve") <(echo "$title") | column -t -s$'\t' -L --table-columns ${vulid},${level},${cveid},${titleout}
그러면 다음과 같은 출력이 제공됩니다.
VULDB-ID LEVEL CVE TITLE
122215 LOW CVE-2015-9261 BusyBox up to 1.27.1 ZIP File decompress_gunzip.c null pointer dereference
119934 MEDIUM CVE-2018-1000517 BusyBox wget memory corruption
119917 MEDIUM CVE-2018-1000500 BusyBox SSL Certificate Validator certificate validation
96755 LOW CVE-2016-2147 BusyBox up to 1.24.x DHCP Client integer overflow
94808 MEDIUM null BusyBox up to 1.23.1/1.4.x cmdline arp_main IFNAME memory corruption
93993 MEDIUM CVE-2016-6301 BusyBox NTP Packet networking/ntpd.c recv_and_process_client_pkt resource management
지금 유일한 의심은 이 접근 방식이 향후 시나리오의 출력에 문제를 일으킬 수 있다는 것입니다. 이를 수행하는 더 우아한 방법이 있습니까?