Разбор текста журнала - PullRequest
       33

Разбор текста журнала

0 голосов
/ 11 июля 2019

У меня есть этот текст журнала:

1. SNMPv2-SMI::enterprises.37447.2.1.1.1 type=4  value=STRING: "Test warn level"
2. SNMPv2-SMI::enterprises.37447.2.1.1.2 type=4  value=STRING: "WARN"
3. SNMPv2-SMI::enterprises.37447.2.1.1.3 type=4  value=STRING: "PSBA2STOR051"  
4. SNMPv2-SMI::enterprises.37447.2.1.1.4 type=4  value=STRING: "AF-201969" 
5. SNMPv2-SMI::enterprises.37447.2.1.1.5 type=4  value=STRING: "PSBA2STOR051" 
6. SNMPv2-SMI::enterprises.37447.2.1.1.6 type=4  value=STRING: "117813866" 
7. SNMPv2-SMI::enterprises.37447.2.1.1.7 type=4  value=STRING: "test"  
8. SNMPv2-SMI::enterprises.37447.2.1.1.8 type=4  value=STRING: "test"

Обратите внимание, что номера заказов не существуют в моем журнале

, и мне нужно извлечь только

Test warn level
test
test

Результат должен быть следующим: Тест предупредить уровень: тест-тест

Я пробовал это:

(SNMPv2-SMI::enterprises.37447.2.1.1.1.*)\n.*\n.*\n.*\n.*\n.*\n(.*SNMPv2-SMI::enterprises.37447.2.1.1.7.*)\n(.*SNMPv2-SMI::enterprises.37447.2.1.1.8.*)

Но это не работает, как мне нужно, он возвращает линию отверстия

Ответы [ 4 ]

1 голос
/ 11 июля 2019

Вы можете сделать:

sed -e 's/.*37447.2.1.1.[178].*"\(.*\)"/\1/;t;d' test.log

Регулярное выражение для поиска строк, содержащих 37447.2.1.1.1, .7 или .8: 37447.2.1.1.[178]

В этих строках берите только то, что находится в кавычках: "\(.*\)"

Не соответствующие строки (t) подавляются (d): t;d

0 голосов
/ 11 июля 2019

Вы получаете совпадение для всей строки, потому что вы используете .* после сопоставления начального текста.

Из вашего примера кажется, что вы хотите получить 3 группы захвата, используя начало SNMPv2-SMI::enterprises.37447.2.1.1.1и укажите последнее число, которое может быть 1, 7 или 8.

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

Если это не так, сопоставьте всю строку.Иначе захватите значение между двойными кавычками в группе.

SNMPv2-SMI::enterprises\.37447\.2\.1\.1\.1 [^"]+"([^"]+)"(?:\n(?!SNMPv2-SMI::enterprises\.37447\.2\.1\.1\.7).*)*\nSNMPv2-SMI::enterprises\.37447\.2\.1\.1\.7[^"]+"([^"]+)"\nSNMPv2-SMI::enterprises\.37447\.2\.1\.1\.8 [^"]+"([^"]+)"

См. Демонстрационную версию regex

Чтобы получить свой результат в Javascript, вы можете использовать эти 3 группы захвата:

const regex = /SNMPv2-SMI::enterprises\.37447\.2\.1\.1\.1 [^"]+"([^"]+)"(?:\n(?!SNMPv2-SMI::enterprises\.37447\.2\.1\.1\.7).*)*\nSNMPv2-SMI::enterprises\.37447\.2\.1\.1\.7[^"]+"([^"]+)"\nSNMPv2-SMI::enterprises\.37447\.2\.1\.1\.8 [^"]+"([^"]+)"/;
const str = `SNMPv2-SMI::enterprises.37447.2.1.1.1 type=4  value=STRING: "Test warn level"
SNMPv2-SMI::enterprises.37447.2.1.1.2 type=4  value=STRING: "WARN"
SNMPv2-SMI::enterprises.37447.2.1.1.3 type=4  value=STRING: "PSBA2STOR051"
SNMPv2-SMI::enterprises.37447.2.1.1.4 type=4  value=STRING: "AF-201969"
SNMPv2-SMI::enterprises.37447.2.1.1.5 type=4  value=STRING: "PSBA2STOR051"
SNMPv2-SMI::enterprises.37447.2.1.1.6 type=4  value=STRING: "117813866"
SNMPv2-SMI::enterprises.37447.2.1.1.7 type=4  value=STRING: "test"
SNMPv2-SMI::enterprises.37447.2.1.1.8 type=4  value=STRING: "test"`;
let res = str.match(regex);
console.log(`${res[1]}:${res[2]}-${res[3]}`)
0 голосов
/ 11 июля 2019

Это выражение может, вероятно, извлечь наши желаемые значения,

.*?37447\.2\.1\.1\.[817].*?value=string\s*:\s*"([^"]+)"

с использованием этой группы захвата ([^"]+).

Выражение объяснено на верхней правой панели этой демонстрации , если вы хотите изучить / упростить / изменить его, а в этой ссылке вы можете посмотреть, как оно будет если хотите, сравнивайте с некоторыми примерами входных данных шаг за шагом.

0 голосов
/ 11 июля 2019

Используя:

/"(Test warn level|test)"+\s*$/gm

вы можете обнаружить

"Test warn level"
"test"  
"test"

и $1 вы можете опустить двойные кавычки и пробелы.

См. https://regexr.com/4ha3r

...