
Ich habe einen MVN-Build instrumentiert, um Profildaten auszugeben, die ich später analysieren möchte. Dazu habe ich das folgende Sed-Skript erstellt, um JSON-Daten aus der Ausgabe des Profilers zu generieren. Ich rufe das Skript mit
cat some.log | sed -nf thescript.sed > some.json
Es erstellt eine verschachtelte Liste von JSON-Objekten („Projekte“), aber jede Liste wird mit einem „“, beendet.
Um daraus eine gültige JSON-Datei zu erstellen, führe ich die folgenden Schritte in meinem bevorzugten Editor aus.
- Alles zu einer Linie zusammenfügen
- Fügen Sie ein umschließendes Objekt ein, indem Sie dem gesamten Inhalt "{\"list\":[" voranstellen und "]}" anhängen.
- Ersetzen Sie alle Vorkommen von ", ]" (falsch abgeschlossene Listen) durch "]"
- Fügen Sie nach jedem Projekt einen Zeilenumbruch ein, um Abstürze beim JSON-Parsing aufgrund zu langer Zeilen zu vermeiden.
Ich führe diese Schritte derzeit manuell aus und möchte dies auch per Skript erledigen.
- Wie kann ich das Sed-Skript dazu bringen, gültiges JSON zu erzeugen (also Zeilenumbrüche zu machennurwenn ich sie will, oder setze dieses abschließende "," nicht)
oder wie kann ich die obigen Schritte in einem anderen Filter skripten?
/[PROFILER]/ s/\[PROFILER\] \(.*\)ms : Task (project-execute new-mvifp:\(.*\):\(.*\) ( task-segment: \[\(.*\)\] )) started./{"\2":{"timestamp":\1,"project":"\2","tasks":"\4","branch":"\3","segments":[/p /[PROFILER]/ s/\[PROFILER\] \(.*\)ms : Task (Segment:\(.*\)) started./{"\2":{"timestamp":\1,"segment":"\2","mojos":[/p /[PROFILER]/ s/\[PROFILER\] \(.*\)ms : Task (mojo-execute \(.*\) {execution: \(.*\)}) started./{"\2":{"timestamp":\1,"mojo":"\2","execution":"\3",/p /[PROFILER]/ s/\[PROFILER\] \(.*\)ms : Task (mojo-execute \(.*\) {execution: \(.*\)}) finished.*duration \(.*\)ms./"duration":\4}},/p /[PROFILER]/ s/\[PROFILER\] \(.*\)ms : Task (Segment:\(.*\)) finished.*duration \(.*\)ms./],"duration":\3}},/p /[PROFILER]/ s/\[PROFILER\] \(.*\)ms : Task (project-execute new-mvifp:\(.*\):\(.*\) ( task-segment: \[\(.*\)\] )) finished.*duration \(.*\)ms./],"duration":\5}},/p