代码之家  ›  专栏  ›  技术社区  ›  The pyramid

将标准输出转换为JSON

  •  3
  • The pyramid  · 技术社区  · 6 年前

    如何grep想要的文本并接收到stdout作为

    var express = require('express');
        var exec = require("child_process").exec;
        var app = express();
        var bodyParser = require('body-parser');
        app.use(bodyParser.urlencoded({ extended: true }));
        app.use(bodyParser.json());
        var port = process.env.PORT || xxxx;
        app.get('/', function(req, res) {
            res.json('API is Online!');
        });
    
    app.post('/data', function(req, res){
    
      //executes my shell script - test.sh when a request is posted to the server
      exec('sh test.sh' , function (err, stdout, stderr) {
        if (!err) {
          res.json({'results': stdout})
        }
      });
    })
    
    
    app.listen(port);
    console.log('Listening on port ' + port);
    

    这是在bash中运行的代码

    #!/bin/bash
     free -m
    

    https://stackoverflow.com/users/2076949/darklightcode 我可以分割结果,但我能像这样进入数组吗

     { results : [ { "total" : the total number, "free" : the free number, "etc" : "etc" } ] } 
    

    不是这样的

    {
        "results": [
            "              total        used        free      shared  buff/cache   available",
            "Mem:            992         221         235          16         534         590",
            "Swap:           263         245          18",
            ""
        ] }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   darklightcode    6 年前

    res.json({'results': stdout.split('\n')}) -现在你可以循环了 results .

    附言: 最后一个换行符可以删除,因为它是空的。这是脚本完成后的新行。

    更新

    convertFreeMemory(stdout.split('\n'))

    console.clear();
    let data = {
      "results": [
        "              total        used        free      shared  buff/cache   available",
        "Mem:            992         221         235          16         534         590",
        "Swap:           263         245          18",
        ""
      ]
    };
    
    convertFreeMemory = (input) => {
    
      let objectFormat = [];
    
      input = input
        .filter(i => i.length)
        .map((i, idx) => {
    
          i = i.split(' ').filter(x => x.length);
    
          if (idx !== 0) {
            i.splice(0, 1);
          }
    
          return i;
    
        });
    
      let [header, ...data] = input;
    
      for (let idx = 0; idx < data.length; idx++) {
    
        let newObj = {};
    
        for (let index = 0; index < header.length; index++) {
    
          if (typeof newObj[header[index]] === 'undefined') {
            newObj[header[index]] = '';
          }
    
          let value = data[idx][index];
          newObj[header[index]] = typeof value === 'undefined' ? '' : value;
    
        }
    
        objectFormat.push(newObj);
    
      }
    
      return objectFormat;
    
    }
    
    console.log(convertFreeMemory(data.results));