什么是将命令的stdout解析为可用的javascript对象最聪明的方法

时间:2011-03-17 14:27:19

标签: javascript regex node.js

我正在编写一个node.js应用程序,我需要将各种命令的stdout解析为javascript对象,我可以通过websocket连接发送到浏览器。

让我们以ping为例。我想发回stdout

64 bytes from ip.isp.com (123.123.123.123): icmp_seq=2 ttl=53 time=7.92 ms

作为

之类的对象
{
  'icmp_seq': 2,
  'ttl': 53,
  'time': '7.92 ms'
}

我也想做很多不同的命令,包括nmap,所以我想确保我尽可能高效,智能地完成它。我现在的计划是做分裂和正则表达式比赛,但我想确保我没有错过任何东西。

4 个答案:

答案 0 :(得分:3)

试试这个正则表达式:

^(?<Size>\d+) bytes from (?<DestinationHost>[^\s]+) \((?<DestinationIP>.+?)\): icmp_seq=(?<ICMPSequence>\d+) ttl=(?<TTL>\d+) time=(?<Time>.+)$

使用多行选项运行此选项。您将不得不调整它以使用您可能收到的所有输出,但是对于您发布的行,它将起作用。

获得结果后,您可以将每个匹配拉出到自己的变量或JSON对象中。

答案 1 :(得分:2)

分裂和正则表达式匹配可能就是我所做的,至少对于像ping这样相当简单的命令。对于任何明显更复杂的事情,您可能必须创建一个基本的(甚至是非基本的)解析器。

答案 2 :(得分:2)

回到一百万年前,我开发了一些使用CLI命令收集系统信息的监控软件(Tivoli)。我所做的是从命令输出中大量使用“awk”管道的末尾。像这样的原生CLI工具的面向行的特性(有时)是一种简单的方法,可以切断CLI输出以实现“屏幕抓取”目的。

答案 3 :(得分:1)

许多'强大的'命令行实用程序将具有特殊的输出模式,旨在轻松解析。例如,我知道nmap有-oX用于XML输出,希望将它转换为JSON很简单。

以下是有关nmap的更多信息:

http://nmap.org/book/man-output.html

所以我强烈建议研究每个命令行实用程序并查找“解析预期”输出选项。

如果你去了正则表达式的路线,一定要尽可能宽容。而不是捕获整个stdout缓冲区并尝试将整个事物解析为一个全局匹配,我会尝试获取您正在寻找的信息的特定子模式,但是ymmv。

但长话短说,不要在这里重新发明轮子。我希望对于每个不同的util,至少有一个页面/线程在线,有人已经这样做了。