SHELL - Config Files abgleichen

furryhamster

Lt. Commander
Registriert
Okt. 2008
Beiträge
1.101
Hi,

ich möchte in der Shell zwei bzw drei Config-Files abgleichen. Dabei gibt es immer eine Source-Config-File und eine ODER zwei Ziel-Config-Files.

Heißt: Die Source-Config-File beinhaltet alle Variablen. Die Ziel Config Files beinhalten alle oder einen Teil der Variablen. Der Abgleich soll nur testen, ob die Variable existiert. Der Zuweisungswert kann unterschiedlich sein.
Die Config Files sind immer gleich aufgebaut. Beispiel:
--Kommentar

variable1=wert1
variable2=wert2

-- Kommentar
variable3=wert3

Mein Lösungsansatz war jetzt die Source Config File mit awk zu durchlaufen und das = als Trenner zu verwenden. Bei diesem Lösungsansatz besteht mein Problem jedoch darin, dass ich zum einen die Ziel-Source File in der While Schleife nur 1x durchlaufen wird und ich außerdem Probleme habe nur den Variablen-Namen zu ermitteln..

Hier mal der bisherige Ansatz:
Code:
function compare_defines {
   SOURCE_FILE=$1
   TARGET_FILE_1=$2
   TARGET_FILE_2=$3
   
   if [ -z ${TARGET_FILE_2} ]
   then
      if [ -r ${SOURCE_FILE} ] && [ -r ${TARGET_FILE_1} ]
      then
         awk -v SOURCE_FILE="${SOURCE_FILE}" -v TARGET_FILE_1="${TARGET_FILE_1}" -F '=' '{
         print "+++++++++++++++++++++++++++"
         print $0
            while (( getline line<TARGET_FILE_1) > 0 ) {
               print "-------------------"
               print line
            }   
         print "+++++++++++++++++++++++++++"
         
         }' ${SOURCE_FILE}
      else
         echo "Konnte define-File nicht lesen"
         return 1
      fi
   else
      if [ -r ${SOURCE_FILE} ] && [ -r ${TARGET_FILE_1} ] && [ -r ${TARGET_FILE_2} ]
      then
         echo "tue etwas"
      else
         echo "Konnte define-File nicht lesen"
         return 1
      fi
   fi
}
 
Zuletzt bearbeitet: (Ergänzung)
Ein einfacher Vergleich per diff reicht Dir nicht?!
 
Leider nicht, da die Dateien unterschiedliche Kommentare/Leerzeilen haben können, ich nur prüfen möchte, ob die Variablen existieren (habe ich falsch beschrieben oben, korrigiere ich) und ich außerdem damit ja nicht gegen zwei Dateien abgleichen kann
 
Kannst du das Problem nicht aufspalten?
Code:
compare_defines(SOURCE_FILE, TARGET_FILE_1);
compare_defines(SOURCE_FILE, TARGET_FILE_2);
Außerdem, vielleicht könnte der comm-Befehl hier hilfreich sein. Der erfordert allerdings eine vorherige on-the-fly Sortierung der Zeilen.
 
Habe es jetzt wie vorgeschlagen aufgespaltet. Schien mir wirklich sinnvoller zu sein. Habe es dann mittels zwei read line Schleifen gelöst. comm hätte denke nicht weiter geholfen, da sich die Werte der Variablen unterscheiden dürfen. Aber gut für die Zukunft den Befehl zu kennen
 
Die Idee war grob folgende:
Code:
comm -2 <(sort $SOURCE_FILE) <(sort $TARGET_FILE)
- liefert die Zeilen, die es nur in $SOURCE_FILE gibt
- Zeilen wie gehabt an '=' aufsplitten, um den Variablennamen zu ermitteln
- Variablenname/Zeile in einem Hash Array ablegen
- Zieldatei durchrattern und Zeilen bei Übereinstimmung im Variablennamen ersetzen
 

Ähnliche Themen

Zurück
Oben