Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是解析命令的最智能的方法';将标准输出转换为可用的javascript对象_Javascript_Regex_Node.js - Fatal编程技术网

什么';这是解析命令的最智能的方法';将标准输出转换为可用的javascript对象

什么';这是解析命令的最智能的方法';将标准输出转换为可用的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' } 我也想使用很多不同的

我正在编写一个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'
}

我也想使用很多不同的命令,包括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美元吧?)