Bash Multiline Output zu Single Line mit Delimiter

Eagle_B5

Ensign
Registriert
Feb. 2016
Beiträge
197
Hallo an alle Scripter

Leider komme ich mit meinem Script nicht weiter und benötige Hilfe von erfahrenen Shell Scriptern. Als Ausgangslage habe ich folgenden Output:
Code:
world 17461267 vmm0:dummy01 vcUuid:'50 1e 7d 05 7b dc 5f 1d-54 ce 53 c8 53 62 c5 18'
port 67108986 dummy01.eth0
  vNic slot 2
   name: nic-17461267-eth0-vmware-sfw.2
--
world 17500708 vmm0:web01a vcUuid:'50 1e 25 e3 b9 6b f6 a3-54 64 b9 1a 23 f9 3e fa'
port 67108987 web01a.eth0
  vNic slot 2
   name: nic-17500708-eth0-vmware-sfw.2

Diesen möchte ich für eine For-Schleife auf zwei Linien zusammenfassen, so dass bei den Zeichen "--" ein Zeilenumschlag gemacht wird.

So sollte der Output dann aussehen:
Code:
world 17461267 vmm0:dummy01 vcUuid:'50 1e 7d 05 7b dc 5f 1d-54 ce 53 c8 53 62 c5 18',port 67108986 dummy01.eth0,vNic slot 2,name: nic-17461267-eth0-vmware-sfw.2
world 17500708 vmm0:web01a vcUuid:'50 1e 25 e3 b9 6b f6 a3-54 64 b9 1a 23 f9 3e fa',port 67108987 web01a.eth0,vNic slot 2,name: nic-17500708-eth0-vmware-sfw.2

Mit awk -v d="," '{s=(NR==1?s:s d)$0}END{print s}' fasse ich es leider als einzelne Linie zusammen. Wie kann ich diese "--" Zeichen als zusätzlichen Zeilenumschlag definieren?

Danke für die Hilfe
 
Linux sed mit Multiline regex koennte man versuchen. Aber auch mit awk oder Perl geht das wunderbar
 
  • Gefällt mir
Reaktionen: Der Lord
Wenn du jetzt einfach ein | sed 's/,--,/\n/' hinten dran hängst, hast du bereits dein Ziel erreicht. Es gibt sicher auch elegantere Lösungen, aber dafür bin ich grad selbst zu bequem ^^

Der Beispieltext sieht mir auf dem ersten Blick nicht wirklich nach ner Hausaufgabe aus...
 
@Hayda Ministral Dann erklär doch mal den Unterschied zwischen Ziel und Aufgabenstellung :)

Nein ist keine Hausaufgabe. Es geht hierbei um das Auslesen aller NSX-T Distributed Firewall Regeln per VM in meinem Homelab, damit ich diese Informationen zB. mit vRrealize Log Insight weiter aufbereiten kann.
Die Schwierigkeit hierbei ist, dass das ESXi Kommando summarize-dvfilter einfach eine Liste ausgibt und ich eigentlich nur den Port- und den sfw.2-Namen benötige.

Bsp:
Code:
world 18108624 vmm0:dummy01 vcUuid:'50 1e 7d 05 7b dc 5f 1d-54 ce 53 c8 53 62 c5 18'
port 67108990 dummy01.eth0
  vNic slot 2
   name: nic-18108624-eth0-vmware-sfw.2
   agentName: vmware-sfw
   state: IOChain Attached
   vmState: Attached
   failurePolicy: failClosed
   serviceVMID: 1
   filter source: Dynamic Filter Creation
   moduleName: nsxt-vsip-17107169
port 67108991 dummy01.eth1
  vNic slot 2
   name: nic-18108624-eth1-vmware-sfw.2
   agentName: vmware-sfw
   state: IOChain Attached
   vmState: Attached
   failurePolicy: failClosed
   serviceVMID: 2
   filter source: Dynamic Filter Creation
   moduleName: nsxt-vsip-17107169

Diesen Output summarize-dvfilter | grep -B 2 "sfw.2$" | awk '{gsub(/--/,"\n"); print}' ORS="" speichere ich nun in eine Variable. Wenn ich diese nun wieder ausgebe, zB. mit echo "$variable", ist es nicht mehr die gleiche Formatierung sondern wieder komplett anders...

Bsp:
Code:
port
67108990
dummy01.eth0
vNic
slot
2
name:
nic-18108624-eth0-vmware-sfw.2
port
67108991
dummy01.eth1
vNic
slot
2
name:
nic-18108624-eth1-vmware-sfw.2

Somit funktioniert natürlich die geplante For-Schleife nicht...

Bisher habe ich das grep -B 2 als Übeltäter identifizieren können. Wenn ich ohne diese -B Option "greppe", klappt es. Dann habe ich natürlich entweder den Port- oder den sfw.2-Namen aber nicht beide.

Ich könnte natürlich den summarize-dvfilter innerhalb der For-Schleife nochmal ausführen, möchte aber etwas CPU optimierter agieren.

Die For-Schleife würde dann in etwas so aussehen:
Code:
for filter in $(summarize-dvfilter | grep -B 2 "sfw.2$" | awk '{gsub(/--/,"\n"); print}' ORS=""); do
    vNicName="$($filter | awk '{print $3}')"
    vNicDfwRuleCount="$(vsipioctl getrules -f $($filter | awk '{print $8}') | grep -w rule -c)"
done

Irgend welche Ideen? Mir sind sie ausgegangen... Ich seh vermutlich von lauter Bäumen den Wald nicht.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Hayda Ministral
Habs hinbekommen. Übeltäter war IFS, welcher im Standard innerhalb der For-Schleife die Abstände innerhalb einer Variable als Trennzeichen interpretiert.

Initial mit IFS=$'\n' oder mit einer While-Schleife und read -r sind die Lösungen.
 
Zurück
Oben