我正在尝试使用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使用情况,并使解析结果更加容易。