NodeJS读取并parsingstdout的每一行

我有一个NodeJS脚本'exec是一个subprocess来捕获文件的cat转储:

var exec = require('child_process').exec; var result = ''; var child = exec('./scripts/first.sh',function(err, stdout, stderr) { result = stdout.split("="); }); 

如果文件不在那里,我会转储一个不同的文件:

 var result = ''; var child = exec('./scripts/first.sh',function(err, stdout, stderr) { result = stdout.split("="); if(stdout.indexOf('No such file or directory') != -1){ var child = exec('./scripts/second.sh', function(err, stdout, stderr) { result = stdout.split("="); }); }); 

最后我logging结果variables的值:

 console.log(result); 

这些文件将具有如下所述的数据:

 line_1 = 7888 line_2 = 8998 line_3 = 9090 line_4 = 9097 

我需要parsing和提取line_1和line_3的值?

结果variables不显示任何值。 我的想法是得到一个stringvariables的标准输出数据,并使用一些search机制。

虽然我不确定的方法,因为我没有太多的JS / NodeJS的经验。

== ==编辑

请find我写的function的复制品。

 var exec = require('child_process').exec; function getdetail() { var result = ''; var child = exec('./scripts/first.sh', function(err, stdout, stderr) { if(stdout.indexOf('No such file or directory') != -1){ var child = exec('./scripts/second.sh',function(err, stdout, stderr) { result = stdout.toString().split("="); console.log(result); }); } else { result = stdout.toString().split("="); console.log(result); } }); } 

标准输出stream对象上的tostring()做了窍门,但是我得到如下所述的控制台日志:

 [ 'spawn ssh -o UserKnownHostsFile', '/dev/null -o StrictHostKeyChecking', 'no user@www.mybox.com cat ver.txt\r\nWarning: Permanently added \'www.mybox.com,XX.XX.XX.XX\' (RSA) to the list of known hosts.\r\r\nuser@www.mybox.com\'s password: \r\line_1', '9400\r\nline_2', '3508\r\nline_3', '77f3\r\nline_4', '/tmp\r\nline_5', '/tmp/ramdisk/\r\nline_5', '77f3\r\n' ] 

我如何提取line_1和line_3的值?

       

网上收集的解决方案 "NodeJS读取并parsingstdout的每一行"

exec是asynchronous的。 因此,如果你写这样的东西:

 var result = ''; var child = exec('...'), function() { result = 'abc'; } ); console.log(result); 

然后result可能是空的,因为console.log(result)可以并经常在exec返回到它的callback并填充新值之前得到执行。

为了解决这个问题,你需要在exec的callback函数中asynchronous处理结果。

另外,我不确定您检查错误的方式是否是最好的。 而不是检查“没有这样的文件或目录”,你可以简单地testingerr是否有非空值:

 if(err) { 

把这一切放在一起,我们结束了以下代码:

 var exec = require('child_process').exec; var result = ''; var processResult = function(stdout) { var result = stdout.split("="); console.log(result); }; var child = exec('./scripts/first.sh',function(err, stdout, stderr) { if(err) { var child = exec('./scripts/second.sh', function(err, stdout, stderr) { processResult(stdout); }); } else { processResult(stdout); } }); 

如果您需要进一步处理stdout数据,则需要遍历它以查找包含“key = value”的所有可能的string出现次数。 这是一个粗略的想法:

 var processResult = function(stdout) { var lines = stdout.toString().split('\n'); var results = new Array(); lines.forEach(function(line) { var parts = line.split('='); results[parts[0]] = parts[1]; }); console.log(results); }; 

我希望这可以让你开始。