次の形式のログがあります。
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)
これでステートマシンをグラフィカルに再構成したいのですが、この問題をどのように解決するかを少し躊躇しています。トランジションを削除することは問題ではありませんが、トランジションでグラフィック表現を再構築する方法はわかりません。
ベストアンサー1
どういう意味なのか分からないけど、こんなことをお探しですか?
使ったグラフィックビジュアライゼーション、変換を説明するテキスト入力ファイルを取得し、自動的にグラフを計算します。正確なコマンドは次のとおりです。
$ 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
- Dotはノード名のハイフンが好きではないので、それをアンダースコアに変換します。gawk
-標準awkにはgawkの機能はありませんmatch
。任意の方法で文字列操作を実行できます(たとえば、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"];
2つのノード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
次のとおりです。