2017-06-13 4 views
0

Ich habe Probleme herauszufinden, wie am Anfang jeder Zeile anhängen, wenn der Anfang der Zeile mit dem Servernamen in einer Variablen übereinstimmt. Es ist zwar schön, aber nicht erforderlich, wenn keine Site gefunden wurde, um "unknown-site" am Anfang der Zeile anzuzeigen.bash sed, wie an den Zeilenanfang angehängt wird, die Variable am Anfang der Zeile entspricht

Ich habe eine bekannte Liste von Computernamen für jede Site.

site1="server1 server2 ..." 
site2="server3 ..." 

Ich dachte, der Code so etwas wie

sein sollte
for each servername in $site1 do; sed command in file 
for each servername in $site2 do; sed command in file 

Die Rohdaten, die

server1 data1... 
server1 data2... 
server3 data3... 
server3 data2... 
server2 data4... 
server3 data3... 
server2 data5... 

und das sollte mir geliefert wurde sein die aus

setzen
site1 server1 data1... 
site1 server1 data2... 
site2 server3 data3... 
site2 server3 data2... 
site1 server2 data4... 
site2 server3 data3... 
site1 server2 data5... 
+0

Woher beziehen Sie die Maschinennamen für jede Site? – 123

+0

Die Maschinennamen sind eine manuell erstellte Liste. Es ist "bekannt", um genau zu sein. – cwheeler33

+0

Können sie in eine Datei geschrieben werden? – 123

Antwort

0

Wenn Sie arrangieren können der Server <> Site-Mapping zu einer Datei (servers) wie folgt aus:

server1 site1 
server2 site1 
server3 site2 

Dann wird dieser einfach mit awk zu tun:

$ awk 'FNR==NR {s[$1] = $2; next} {print s[$1], $0}' servers in 
site1 server1 data1... 
site1 server1 data2... 
site2 server3 data3... 
... 

NR ist die Anzahl der Datensätze (Zeilen) gesehen von awk so weit, FNR die Anzahl der Datensätze in dieser Datei so weit gesehen. Ein Vergleich mit FNR==NR ist ein gängiges Idiom zum Trennen der ersten Datei von den anderen. Also, für jede Zeile der ersten Datei, setzen wir die gefundenen Werte auf das Array s, mit dem ersten Feld ($1) als Schlüssel, und die zweite ($2) als Wert, dann springt auf next Zeile. (Alle Arrays in awk sind assoziativ und arbeiten mit Strings als Schlüssel/Indizes.) Nun haben wir die Site-Namen zu den Servern im Array s (zB s["server1"] == "site1") und für die folgenden Dateien verwenden wir einfach das erste Feld als Index zu Drucken Sie den dort gefundenen Wert zusammen mit der vollständigen Eingabezeile ($0).

Wir auch einen bekannten Marker (statt leer) für die unbekannte durch Prüfen, ob s[$1] existiert und nicht leer hinzufügen könnte:

$ awk 'FNR==NR {s[$1] = $2; next} {if (s[$1]) print s[$1], $0; else print "unknown", $0; next}' servers data.txt 

Mit den Server-Namen, wie Sie in der Shell hatte, konnte man produzieren die servers Datei mit etwas wie folgt aus:

site1="server1 server2 ..." 
site2="server3 ..." 
true > servers  # to clear the file 
for x in $site1 ; do echo "$x site1" ; done >> servers 
for x in $site2 ; do echo "$x site2" ; done >> servers 
+0

Erstellen des Servers <> Site-Datei wäre sehr arbeitsintensiv für eine einige hundert Server ... – cwheeler33

+0

Ich habe noch nie awk benutzt ... kannst du erklären, was du tust? und wie gebe ich die Datei "datafile" und die Datei "servesitepairing" an? Ich muss verstehen ... – cwheeler33

+0

hmmm ...und um die Paar-Datei zu erstellen, kann ich einfach so etwas tun (muss später die Syntax überprüfen, aber) ... $ für Servername in site1 do; echo -e "$ servername SiteName \ n" >> serversitepairfile – cwheeler33

0

Try this:

awk -F '[ ="]+' 'NR==FNR {for (i=2; i<=NF; i++) { sites[$i]=$1; }; next } 
       { print sites[$1] " " $0 }' sites data 
Verwandte Themen