Как извлечь значение из значений, разделенных запятыми, в Perl? - PullRequest
3 голосов
/ 08 апреля 2010

У меня есть файл журнала, содержащий статистику с разных серверов. Я отделяю статистику от этого файла журнала, используя только регулярные выражения. Я пытаюсь захватить использование процессора из запущенного процесса. Для SunOS у меня есть вывод ниже:

process,10050,user1,218,59,0,1271M,1260M,sleep,58.9H,0.02%,java

Здесь CPU% находится на 11-м поле, если мы разделяем запятыми (,). Это поле имеет знак%, который является уникальным, и я могу использовать ниже регулярное выражение, чтобы получить это значение:

regex => q/^process,(?:.*?),((?:\d+)\.(?:\d+))%,java$/,

Для системы Linux у меня есть вывод ниже:

process,26190,user1,20,0,1236m,43m,6436,S,0.0,1.1,0:00.00,java,

Здесь загрузка ЦП находится в 10-м столбце, но без знака%, и в этом поле нет ничего уникального.

Какой шаблон регулярного выражения я должен использовать, чтобы получить это значение?

Ответы [ 5 ]

3 голосов
/ 08 апреля 2010

Если строка уже разделена запятой, вы можете просто использовать split в строке и выбрать правильное поле.

например

my @fields = split(/,/, $input);
2 голосов
/ 08 апреля 2010

Вам нужно также распознать строку или только извлечь значение, т. Е. Ожидаете ли вы несколько не связанных строк? Если не ответ /^(?:[^,]+,){9}([^,]+)/' это извлечет десятое поле из некоторого списка через запятую

1 голос
/ 08 апреля 2010

Используйте Text :: CSV_XS для работы со значениями, разделенными запятыми. Если вы задаете вопрос, вы не должны пытаться решить его самостоятельно. Модуль чрезвычайно оптимизирован, и вы не сможете выполнять свою работу лучше.

Как только вы извлечете правильную позицию, вы можете убрать знак%, если он там есть.

0 голосов
/ 08 апреля 2010

Я ничего не знаю о Linux, но просто игнорирую код, если он выглядит слишком наивно:)

 /^process.*(?<=[A-Z],)((?:\d+)\.(?:\d+)).*java$/;
0 голосов
/ 08 апреля 2010

у вас есть структура данных, которая имеет четкий разделитель, поэтому не используйте регулярные выражения, а просто используйте расщепление и получите ваш элемент по индексу (или порезке)Это легче.

$output="process,10050,user1,218,59,0,1271M,1260M,sleep,58.9H,0.02%,java";
@s = split /,/,$output;
print "$s[10]\n";

для Linux, просто получите $s[9]

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