Eu não tenho certeza se você entende o que você quer dizer, mas você está procurando por algo assim?
Euusei
$ 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
Explicação
-
sed 's/-/_/g' input
- Dot não gosta de hifens no nome do nó, então eu os converti em sublinhados -
gawk
- O awk padrão não possui a funçãomatch
que o gawk possui; você pode fazer a manipulação de string da maneira que quiser (por exemplo, perl é outra boa escolha)-
BEGIN {print "digraph g {"}
- As especificações de pontos começam com esta linha (o nome do gráfico, "g", não importa realmente) -
END {print "}"}
- Termina odigraph g
iniciado no bloco BEGIN -
match($0, /from ([^ ]*) to ([^ ]*) \((.*)\)$/, groups)
- Uma expressão regular que corresponde ao seu formato de arquivo de log; armazena os resultados na variávelgroups
-
print groups[1] " -> " groups[2] " [label = \"" groups[3] "\"];"
- Produz uma linha compatível com pontos (por exemplo,A -> B [label = "C"];
mostrará dois nós, A e B, com uma transição entre eles denominada C)
-
-
dot -Tpng output.dot > output.png
- Diga ao graphviz para converter o arquivo de ponto para um PNG
Arquivo de pontos resultante
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"];
}
O PNG que você obtém ao executar esse arquivo por meio de dot
está acima