从Node.JS中的输出管道“剪切”文本

时间:2014-06-15 16:05:48

标签: database node.js grep ping

我正在node.js中编写我的第一个应用程序,我不是很熟悉windows,因为我是linux,我想知道我怎么能得到像ping这样的子进程的输出,只是得到毫秒的毫秒数ping结束,例如,这是ping google.com的输出。

    Pinging google.com [74.125.226.4] with 32 bytes of
    Reply from 74.125.226.4: bytes=32 time=90ms TTL=53
    Reply from 74.125.226.4: bytes=32 time=100ms TTL=5
    Reply from 74.125.226.4: bytes=32 time=75ms TTL=53

我希望能够将字符串的时间剪切掉^ ^并将其用于其他内容,例如将其存储在数据库中。这个过程在linux中被称为“Grep”,我可以在节点中做什么,可以跨平台工作,因为在我知道的窗口中没有grep等价物。

    var sys = require('sys')
    var exec = require('child_process').exec;
    function puts(error, stdout, stderr) { sys.puts(stdout) }
    exec("ping -n 3 google.com", puts);

这是我的node.js代码到目前为止,这只是在子进程中ping谷歌,我得到了puts变量的响应,我希望能够只记录数据库中的时间。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用正则表达式提取您喜欢的内容,并使用node.js中的 os 模块的依赖于os的EOL属性来分割行。这是一个完整的示例(我修改过)用于OS X的ping命令。)您可以使用 args 属性为正则表达式构造函数提供更多参数,最重要的是" g"它将查找所有出现的情况一行,而不是第一行。

var sys  = require('sys');
var exec = require('child_process').exec;
var EOL  = require('os').EOL;

function funGrep(cmd,callback,search,args){
    exec(cmd,function(err,stdout){
        if(!err){
            console.log(err);
            return;
        }
        if(!stdout)
            return;
        var lines = stdout.toString().split(EOL);
        var re = new RegExp(search,args);
        for(var line in lines){
            var results = lines[line].match(re);
            if(results){
                for(var i = 0; i < results.length; i++){
                    callback(results[i]);
                }
            }
        }
    });
}

funGrep("ping -c 3 google.com",console.log,"time=[0-9\.]+ ms");
/*
output on OS X:
time=27.878 ms
time=27.652 ms
time=28.134 ms
*/
//for Windows:
funGrep("ping -t 3 google.com",console.log,"time=[0-9\.]+ ?ms");