grep -o를 사용하여 줄 바꿈을 극복하십시오.

grep -o를 사용하여 줄 바꿈을 극복하십시오.

다음과 같은 파일이 있습니다.

{
  "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또한 일반적으로 -PPCRE를 지원합니다. 이는 \KPCRE 버전 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

관련 정보