Regex для табличного контента, используя Javascript - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь получить указанные c значения из файла .txt, используя NodeJS. Надеюсь, что использование 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

Спасибо !! ..

Ответы [ 3 ]

0 голосов
/ 10 марта 2020

Вы можете сначала уточнить команду top с параметрами, чтобы стало проще извлекать нужные данные:

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

Это напрямую выведет использование ЦП и облегчит синтаксический анализ результата.

0 голосов
/ 10 марта 2020

Обратите внимание, что ваш первый шаблон может быть записан как \b\d+(?:\.\d+)?%id\b, используя одну \d+ соответствующую 1+ цифру, где вы должны экранировать точку, чтобы буквально соответствовать ей.

Если значение также может быть без десятичную часть, вы можете сделать это необязательным

Второй шаблон можно записать как \b\d+k free\b, используя один \d+, чтобы также соответствовать 1+ цифрам. Вы можете использовать границы слов, чтобы слово не входило в большее слово и получать частичные совпадения.


Чтобы получить значение cuic_reporting , вы можете использовать группу захвата и использовать повторяющаяся группа для совпадения значений между% CPU и cuic_reporting.

(\d+(?:\.\d+)?)(?:[^\S\r\n]+\S+){2}[^\S\r\n]+cuic_reporting\b

Regex demo

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+)?)(?:[^\S\r\n]+\S+){2}[^\S\r\n]+cuic_reporting\b/;
console.log(str.match(pattern)[1]);
0 голосов
/ 10 марта 2020

Я даю вам свое мнение о том, как бы я поступил:

После прочтения файла, например, с помощью модуля fs, я попытался бы разделить данные txt (либо с помощью табулятора ('\ t') а также перенос строки ('\ n' или '\ r'), если вы не читаете построчно), и тогда вы можете успешно применить регулярное выражение к каждому элементу полученного массива.

Надеюсь, это поможет Вы!

Ссылки:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...