다음과 같은 파일이 있습니다.
{
"1": {
"state": "RUNNING",
"stats": {
"name": "some-file",
"uris": [
"some-example.com"
],
"host": "127.0.0.1",
"port": 8080,
"uptime": 168,
"mem_quota": 2147483648,
"disk_quota": 2147483648,
"fds_quota": 16384,
"usage": {
"time": "2016-09-13 07:39:40 +0000",
"cpu": 0.30315522606369516,
"mem": 1069568000,
"disk": 237203456
}
}
},
"0": {
"state": "RUNNING",
"stats": {
"name": "some-file2",
"uris": [
"some-example-e.com"
],
"host": "127.0.0.2",
"port": 8081,
"uptime": 169,
"mem_quota": 2147483648,
"disk_quota": 2147483648,
"fds_quota": 16384,
"usage": {
"time": "2016-09-13 07:39:40 +0000",
"cpu": 0.3086296386531593,
"mem": 1073180672,
"disk": 237203456
}
}
},
"2": {
"state": "RUNNING",
"stats": {
"name": "some-file3",
"uris": [
"some-example.com"
],
"host": "127.1.20.3",
"port": 8190,
"uptime": 168,
"mem_quota": 2147483648,
"disk_quota": 2147483648,
"fds_quota": 16384,
"usage": {
"time": "2016-09-13 07:39:40 +0000",
"cpu": 0.31213565359044587,
"mem": 1072861184,
"disk": 237203456
}
}
}
}
cpu, mem, disk 값을 추출해서 다음과 같은 형식의 파일에 넣어야 합니다.
0.30315522606369516,1069568000,237203456,0.3086296386531593,1073180672
기본적으로는 그래야 한다
first_instance_cpu,first_instance_mem,first_instance_disk,second_instance_cpu,second_instance_mem...
나는 당신이 이것을 이해하기를 바랍니다.
grep
이러한 값을 검색하려면 다음 명령문을 사용합니다 .
grep -Eow '"(cpu|mem|disk)": [0-9.]+' SampleOutput | grep '[0-9.]'
이것은 나에게 다음과 같은 결과를 제공합니다
"cpu": 0.30315522606369516
"mem": 1069568000
"disk": 237203456
"cpu": 0.3086296386531593
"mem": 1073180672
"disk": 237203456
"cpu": 0.31213565359044587
"mem": 1072861184
"disk": 237203456
숫자(일치)를 빨간색으로 강조표시하고 싶습니다. 이제 숫자만 원하지만 -o
두 번째 grep
명령에서 해당 옵션을 사용하면 물론 숫자를 얻지만 각 숫자는 아래와 같이 다른 줄에 있습니다.
0
.
3
3
1
...등.
다른 행에서 최소한 정수인 결과를 얻는 방법은 무엇입니까? 그런 다음 tr 등을 사용하여 쉼표로 구분할 수 있습니다.
답변1
파일이 JSON 형식이므로 다음을 사용합니다.잭:
jq '
flatten |
map(.stats.usage | del(.time)) |
map([.cpu, .mem, .disk]) |
flatten |
.[]' <file.json | \
paste -sd ,
산출:
0.30315522606369516,1069568000,237203456,0.3086296386531593,1073180672,237203456,0.31213565359044587,1072861184,237203456
답변2
$ grep -Po '"(cpu|mem|disk)": \K[\d.]+' SampleOutput | paste -sd , -
0.30315522606369516,1069568000,237203456,0.3086296386531593,1073180672,237203456,0.31213565359044587,1072861184,237203456
grep
지원되는 구현은 -o
또한 일반적으로 -P
PCRE를 지원합니다. 이는 \K
PCRE 버전 7.2(2007년 6월 19일 이상)에서 일치하는 텍스트의 시작 부분을 재설정하는 데 사용할 수 있습니다(따라서 grep -o
오른쪽에 일치하는 내용만 출력됩니다).
귀하의 방법은 그다지 멀지 않습니다. 즉, 다음 grep -o '[0-9.]'
과 같이 바꾸십시오.grep -oE '[0-9.]+'
순서하나의 숫자나 점이 아닌 하나 이상의 숫자나 점.
답변3
해결책 도 있습니다 jq
:
jq -r '.[].stats.usage|[.cpu,.mem,.disk]|@csv' f.json