Регулярные выражения помогают разобрать вывод SQLIO - PullRequest
0 голосов
/ 18 марта 2010

Я работал над регулярным выражением для анализа выходных данных серии прогонов SQLIO. Я получил довольно далеко, но еще не совсем там. Я ищу 100% -ое решение регулярных выражений и никаких предварительных манипуляций с вводом. Может ли кто-нибудь помочь с небольшим руководством со следующим регулярным выражением:

.*v(?<SQLIOVersion>\d\.\d).*\n.*\n(?<threads>\d*)\s.*for\s(?<Seconds>\d+).*\n.*using\s(?<clustersize>[0-9]*)KB.*\n.*\n.*size:\s(?<currentfilesize>\d+).*\n.*\n.*\n.*\n.*\s(?<IOs>\d*\.\d*).*\n.*\s(?<MBs>\d*\.\d*).*\n.*\n.*\s(?<MinLatency_ms>\d+).*\n.*\s(?<AvgLatency_ms>\d+).*\n.*\s(?<MaxLatency_ms>\d+).*\n.*\n.*\n\%\:..(?<ms>\d*\s+)*

Вот фрагмент вывода - обратите внимание на заголовки, которые меняются во время пакетного запуска SQLIO: Файл

Ответы [ 2 ]

1 голос
/ 18 марта 2010

Проблема, кажется, здесь:

    using 8KB random IOs
    buffering set to use hardware disk cache (but not file cache)

После захвата размера кластера вы используете .*\n, чтобы использовать вторую строку перед тем, как продолжить захват размера файла, но иногда есть третья строка:

    using 8KB random IOs
    enabling multiple I/Os per thread with 8 outstanding
    buffering set to use hardware disk cache (but not file cache)

Я добавил (?:.*\n)? в соответствующий раздел регулярного выражения, и теперь он соответствует всем 36 записям.

Я знаю, что вы хотите использовать регулярное выражение на 100%, но рассматривали ли вы возможность написания регулярного выражения в расширенном формате с комментариями (т.е. режим IgnorePatternWhitespace)? Я также рекомендовал бы использовать более регулярный текст в регулярном выражении, чтобы было легче следовать. Например,

(?<threads>\d+) threads? reading for (?<Seconds>\d+) secs.*\n

вместо

(?<threads>\d*)\s.*for\s(?<Seconds>\d+).*\n

Нечитаемый код - это не поддерживаемый код, и регулярные выражения нуждаются во всей помощи, которую они могут получить. : - /

0 голосов
/ 18 марта 2010

Ад с счетными линиями, пока порядок не меняется, вы можете сделать следующее. Да, и использование / x для больших регулярных выражений помогает. ;)

qr§
^sqlio\s+v(?<SQLIOVersion>\d+\.\d+)

(?> # atomic match, dont backtrack in here when matched
.{0,400}? # dont match so far that we can get the next result
(?<threads>\d+)\s+thread)

(?>.{0,400}?
\b for\s+(?<Seconds>\d+)\s*sec)

(?>.{0,400}?
\b using\s+(?<clustersize>\d+)\s*KB)

(?>.{0,400}?
\b size:\s+(?<currentfilesize>\d+))

(?>.{0,400}?
\b IOs/sec\D*(?<IOs>\d+\.\d+))

(?>.{0,400}?
\b MBs/sec\D*(?<IOs>\d+\.\d+))

(?>.{0,400}?
\b Min_Latency\D*(?<MinLatency_ms>\d+))

(?>.{0,400}?
\b Avg_Latency\D*(?<AvgLatency_ms>\d+))

(?>.{0,400}?
\b Max_Latency\D*(?<MaxLatency_ms>\d+))

(?>.{0,400}?
^\%:\s*(?<ms>(?:\d+\s+)+))

§mixs

PCRE / Perl qr§§ используется для цитирования.

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