Креслення державної машини з колод


5

У мене є журнали у такому форматі:

03/22/2011 14:45:06;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35707.arien.ics.muni.cz state from EXITING-RETURNSTD to EXITING-STAGEOUT (5-51)
03/22/2011 14:45:06;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35709.arien.ics.muni.cz state from RUNNING-PRERUN to RUNNING-RUNNING (4-42)
03/22/2011 14:45:07;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35708.arien.ics.muni.cz state from RUNNING-RUNNING to EXITING-EXITING (5-50)
03/22/2011 14:45:07;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35708.arien.ics.muni.cz state from EXITING-EXITING to EXITING-RETURNSTD (5-70)
03/22/2011 14:45:07;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35708.arien.ics.muni.cz state from EXITING-RETURNSTD to EXITING-STAGEOUT (5-51)
03/22/2011 14:45:08;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35709.arien.ics.muni.cz state from RUNNING-RUNNING to EXITING-EXITING (5-50)

Зараз я хотів би графічно реконструювати державну машину, але я колись вагаюся, як підійти до цієї проблеми. Вирізання переходів не повинно бути проблемою, але я не впевнений, як реконструювати графічне зображення з них.

Відповіді:


15

Я не впевнений, я знаю, що ти маєш на увазі, але ти шукаєш щось подібне?

Вихід точки

Я використав Graphviz , який приймає файли введення тексту, що описують переходи, і автоматично виводить графік. Ось точна команда:

$ sed 's/-/_/g' input | gawk '
    BEGIN {print "digraph g {"}
    END {print "}"}
    match($0, /from ([^ ]*) to ([^ ]*) \((.*)\)$/, groups) {
        print groups[1] " -> " groups[2] " [label = \"" groups[3] "\"];"
    }' > output.dot
$ dot -Tpng output.dot > output.png

Пояснення

  • sed 's/-/_/g' input - Крапка не любить дефісів у назві вузла, тому я перетворив їх на підкреслення
  • gawk- Стандартний awk не має matchфункції, яку має gawk; ви можете робити маніпуляції з рядками будь-яким способом, який вам подобається (наприклад, perl - ще один хороший вибір)
    • BEGIN {print "digraph g {"} - Специфікація точок починається з цього рядка (назва графіка, "g", насправді не має значення)
    • END {print "}"}- Закінчується digraph gрозпочатим у блоці BEGIN
    • match($0, /from ([^ ]*) to ([^ ]*) \((.*)\)$/, groups)- регулярний вираз, що відповідає вашому формату файлу журналу; він зберігає результати у groupsзмінній
    • print groups[1] " -> " groups[2] " [label = \"" groups[3] "\"];"- Виводить лінію, сумісну з крапками (наприклад, A -> B [label = "C"];будуть показані два вузли, A і B, з переходом між ними з міткою C)
  • dot -Tpng output.dot > output.png - Скажіть graphviz, щоб перетворити точковий файл у PNG

Отриманий файл крапок

digraph g {
EXITING_RETURNSTD -> EXITING_STAGEOUT [label = "5_51"];
RUNNING_PRERUN -> RUNNING_RUNNING [label = "4_42"];
RUNNING_RUNNING -> EXITING_EXITING [label = "5_50"];
EXITING_EXITING -> EXITING_RETURNSTD [label = "5_70"];
EXITING_RETURNSTD -> EXITING_STAGEOUT [label = "5_51"];
RUNNING_RUNNING -> EXITING_EXITING [label = "5_50"];
}

PNG, який ви отримуєте під час запуску цього файлу dot, вище


Thx, я зрозумів, що надмірно ускладнюю це в голові :-) Ваша відповідь приголомшлива.
Let_Me_Be

Це чудова відповідь!
Рамон Заразуа Б.

1

Я працюю над інструментом, щоб зробити саме те, що ви хочете - генерувати кінцеві машини з журналів. Інструмент називається Synoptic, і ви можете дізнатися більше про нього тут: http://code.google.com/p/synoptic/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.