使用 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 和磁盘的值并将其放入格式如下的文件中:

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,其中\K(在 PCRE 版本 7.2 19-Jun-07 或更高版本中)可用于重置匹配文本的开头(因此grep -o仅输出其右侧匹配的内容)。

你的方法并不远,你只需替换grep -o '[0-9.]'grep -oE '[0-9.]+',即 find序列一位或多位数字或点,而不是只有一位数字或点。

答案3

还有一个jq解决方案:

jq -r '.[].stats.usage|[.cpu,.mem,.disk]|@csv'  f.json

相关内容