Regex用于使用Javascript的表格内容



我正在尝试使用NodeJS从.txt文件中获取特定值。希望使用Regex是实现这一目标的最佳方式。所以我尝试了下面的代码,在这里我可以从非表格区域获得值。

var res4 = data.match(/d*.d*%id/g);
var res5 = data.match(/d*d*k free/g);
console.log(res4); **// [ '93.2%id' ]**
console.log(res5); **//[ '862100k free', '6143996k free' ]**

但是当我试图在.txt文件的表格格式中获取值时,我无法做到。下面是源.txt文件供您参考。这里我需要cuic_reporting(在命令列中(及其相应的%CPU列值。请帮助我。谢谢。

top - 02:51:10 up 176 days, 23:47,  1 user,  load average: 0.13, 0.09, 0.07
Tasks: 208 total,   1 running, 207 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.7%us,  1.9%sy,  0.1%ni, 93.2%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  16336156k total, 15474056k used,   862100k free,   362908k buffers
Swap:  6143996k total,        0k used,  6143996k free,  8415656k cached
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20967 OSAdmin   30  10 1299m 120m  26m S 35.7  0.8   0:03.47 java
14231 tomcat    20   0 3422m 3.1g  22m S  2.0 20.0  10869:37 cuic_reporting
1 root      20   0 19572 1812 1244 S  0.0  0.0   2:59.65 init
2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
3 root      RT   0     0    0    0 S  0.0  0.0  25:22.51 migration/0
4 root      20   0     0    0    0 S  0.0  0.0   2:42.43 ksoftirqd/0
5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0
6 root      RT   0     0    0    0 S  0.0  0.0   0:14.34 watchdog/0
7 root      RT   0     0    0    0 S  0.0  0.0  25:47.89 migration/1
8 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/1

谢谢!!。。

请注意,您的第一个模式可以写为bd+(?:.d+)?%idb,使用一个匹配1+数字的d+,您必须转义点才能真正匹配它。

如果该值也可以不包含小数部分,则可以将其设为可选

第二种模式也可以使用单个d+来匹配1+个数字来写为bd+k freeb。您可以使用单词边界来防止单词成为较大单词的一部分,并获得部分匹配。


要获得cuic_reporting的值,可以使用捕获组并使用重复组来匹配%CPU和cuic-reporting之间的值。

(d+(?:.d+)?)(?:[^Srn]+S+){2}[^Srn]+cuic_reportingb

Regex演示

let str = ` top - 02:51:10 up 176 days, 23:47,  1 user,  load average: 0.13, 0.09, 0.07
Tasks: 208 total,   1 running, 207 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.7%us,  1.9%sy,  0.1%ni, 93.2%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  16336156k total, 15474056k used,   862100k free,   362908k buffers
Swap:  6143996k total,        0k used,  6143996k free,  8415656k cached
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20967 OSAdmin   30  10 1299m 120m  26m S 35.7  0.8   0:03.47 java
14231 tomcat    20   0 3422m 3.1g  22m S  2.0 20.0  10869:37 cuic_reporting
1 root      20   0 19572 1812 1244 S  0.0  0.0   2:59.65 init
2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
3 root      RT   0     0    0    0 S  0.0  0.0  25:22.51 migration/0
4 root      20   0     0    0    0 S  0.0  0.0   2:42.43 ksoftirqd/0
5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0
6 root      RT   0     0    0    0 S  0.0  0.0   0:14.34 watchdog/0
7 root      RT   0     0    0    0 S  0.0  0.0  25:47.89 migration/1
8 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/1`;
let pattern = /(d+(?:.d+)?)(?:[^Srn]+S+){2}[^Srn]+cuic_reportingb/;
console.log(str.match(pattern)[1]);

我给你我对如何做的看法:

例如,在用fs模块读取文件后,我会尝试拆分txt的数据(通过制表符('\t'(,如果你不逐行读取,也可以通过换行符('\n'或'\r'((,然后你可以成功地将regex应用于生成的数组的每个元素。

我希望它能帮助你!

参考文献:

https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/String/split

https://nodejs.org/api/fs.html

https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/String/match

您可以首先用参数细化top命令,这样提取所需数据变得更容易:

ps -p `pgrep -d "," cuic_reporting` -o %cpu

这将直接输出CPU使用情况,并使解析结果更加容易。