Frage zu awk und Arrays



  • Hallo, ich habe das folgende Skript programmiert um mir Informationen über Volume Groups etc. anzeigen zu lassen.

    #!/bin/ksh
    #
    
    clear
    
    printf "----------+------------------+--------------------------+\
    ----+-----------------+\n"
    printf "%-9s | %-17s| %-25s| %-2s | %-12s    |\n" "  Volume" \
    "    Physical" "  Path name of the" "MC" "    Status"
    printf "%-9s | %-17s| %-25s| %-2s | %-12s    |\n" "  group" \
    "    volume" "  logical volume"
    printf "----------+------------------+--------------------------+\
    ----+-----------------+\n"
    
    # VGs ermitteln
    set -A VGArray $(vgdisplay 2>/dev/null | awk '/Name/ { print $3 }')
    i=0
    # Fuer alle VG-Elemente im Array
    while [ i -lt ${#VGArray[*]} ]
    do
      # Status der VG ermitteln
      Status=$(vgdisplay ${VGArray[i]} 2>/dev/null | \
               awk '/Status/ { print $3 }')
      printf "%-9s | %-17s| %-25s| %-2s | %-12s    |\n" \
              ${VGArray[i]} "" "" "" $Status 
      # PVs zum VG ermitteln 
      set -A PVArray $(vgdisplay -v ${VGArray[i]} 2>/dev/null | \
                       awk '/PV Name/ { print $3 }') 
      j=0
      while [ j -lt ${#PVArray[*]} ]
      do
        # Status der PV ermitteln
        Status=$(pvdisplay ${PVArray[i]} | awk '/Status/ { print $3 }')
        printf "%-9s | %-17s| %-25s| %-2s | %-12s    |\n" \
                "" ${PVArray[j]} "" "" $Status 
    
        # LVs zum PV ermitteln
        let Zeile1=$(pvdisplay -v ${PVArray[j]} | grep -n Distribution | \
                     cut -d: -f1)+2
        let Zeile2=$(pvdisplay -v ${PVArray[j]} | grep -n extents | \
                     cut -d: -f1)-2
    
        # Alle LVs zwischen den Zeilen auslesen und wo Zeile1>2 ist
        if [ Zeile1 -gt 2 ]
        then
          set -A LVArray $(pvdisplay -v ${PVArray[j]} | sed -n -e \
                           $Zeile1,$Zeile2"p" | awk '{ print $1 }' | \
                           sort +1)
          k=0
          while [ k -lt ${#LVArray[*]} ]
          do
            # Mirror Copie ermitteln
            Mirror=$(lvdisplay ${LVArray[k]} | \
                     awk '/Mirror/ { print $3}') 
            # Status LV ermitteln
            Status=$(lvdisplay ${LVArray[k]} | \
                     awk '/Status/ { print $3 }')
            printf "%-9s | %-17s| %-25s| %-2s | %-12s |\n" \
                    "" "" ${LVArray[k]} $Mirror $Status
            let k=k+1
          done
        fi
    
        let j=j+1
      done
    
      let i=i+1
    # Zeile nach jeder VG
    printf "----------+------------------+--------------------------+\
    ----+-----------------+\n"
    done
    

    Jetzt habe ich von einem Kollegen erfahren, dass die Arrays bei großen Datenmengen nicht mehr ausreichend sein können und man daher lieber direkt alles im awk lösen sollte, da dieser bis zum Speicherüberlauf arbeitet.
    Kann mir jemand einen Lösungsansatz geben, wie ich dieses Skript anpassen könnte um auf die Nutzung von Arrays zu verzichten? 😕



  • Kannstes ja mal mit perl versuchen

    mfg



  • Hallo Mr. Perl! 😉

    Die Aussage hilft mir jetzt nicht wirklich weiter. Ich möchte schon gerne awk bzw. auf jedem System zur Verfügung stehende Tools einsetzen.


Anmelden zum Antworten