什么';这是解析命令的最智能的方法';将标准输出转换为可用的javascript对象
我正在编写一个node.js应用程序,其中需要对各种命令的stdout进行大量解析,将其转换为javascript对象,然后通过websocket连接发送到浏览器 让我们以ping为例。我想把这封信寄回去什么';这是解析命令的最智能的方法';将标准输出转换为可用的javascript对象,javascript,regex,node.js,Javascript,Regex,Node.js,我正在编写一个node.js应用程序,其中需要对各种命令的stdout进行大量解析,将其转换为javascript对象,然后通过websocket连接发送到浏览器 让我们以ping为例。我想把这封信寄回去 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' } 我也想使用很多不同的
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,所以我想确保我的操作尽可能高效和智能。我现在的计划是只做分割和正则表达式匹配,但我想确保我没有错过什么 拆分和正则表达式匹配可能是我要做的,至少对于像
ping
这样相当简单的命令。对于任何更复杂的内容,您可能必须创建基本(甚至非基本)解析器。尝试以下正则表达式:
^(?<Size>\d+) bytes from (?<DestinationHost>[^\s]+) \((?<DestinationIP>.+?)\): icmp_seq=(?<ICMPSequence>\d+) ttl=(?<TTL>\d+) time=(?<Time>.+)$
^(?\d+)字节来自(?[^\s]+)\((?。+)\):icmp\u seq=(?\d+)ttl=(?\d+)时间=(?。+)$
使用“多行”选项运行此操作。你将不得不调整它来处理你可能收到的所有输出,但是对于你发布的那行,它将起作用
一旦得到结果,就可以将每个匹配项提取到它自己的变量或JSON对象中。早在一百万年前,我开发了一些监控软件(Tivoli),它使用CLI命令收集系统信息。我所做的是大量使用“awk”命令输出的管道末端。像这样的本机CLI工具的面向行的特性(有时)是为了“屏幕抓取”目的而截断CLI输出的一种简单方法。许多“强大”命令行实用程序将具有特殊的输出模式,以便轻松解析。例如,我知道nmap有用于XML输出的-oX,希望将其转换为JSON会很简单 以下是有关nmap的更多信息: 因此,我强烈建议研究每个命令行实用程序,并寻找“解析预期的”输出选项 如果你选择了正则表达式,一定要尽可能地宽容。我不会捕获整个stdout缓冲区并尝试将整个内容解析为一个全局匹配,而是尝试获取您正在查找的信息的特定子模式
但长话短说,不要在这里重新发明轮子。我希望对于每个不同的util,至少有一个页面/线程在线,其中有人已经这样做了。Blarg。抢手货我写这篇文章的时候,我的一台服务器坏了,然后回来很快就完成了它,我没有注意到。如果javascript支持命名的捕获组,这看起来是不可能的。悲伤。我想可能是这样的——不过你仍然可以通过数字来引用它们。(“我想是1美元吧?)