Codeschnipsel BASH – Shellscript-Archiv, Script 1

#!/bin/bash

########################################################################
#
# Was macht das Script:
#
# Das Script suche eine bestimmte Zeile im pc_server-Log von Aleph. Die
# gefundenen Zeilen werden in ein separates Log geschrieben, dass von
# Nagios ausgelesen wird und die Anzahl der verbrauchten Lizenzen
# grafisch darstellt.
# Fehlerhafte Zeilen im pc_server-Log erzeugen mehrmals woechentlich
# deutlich ueberhoehte Werte. Um diese fehlerhaften Zeilen auszu-
# sortieren ist der unten aufgefuehrte Regex-Ausdruck entstanden.
#
# Um fehlerhafte Zeilen auszusortieren
#   grep 1) nur Zeilen, die 52 Zeichen lang sind
#   grep 2) letztes Wort herausfiltern
#   grep 3) letztes Wort muss 6 fuehrende Nullen haben und nachfolgend
#           drei beliebige Ziffern
#
# grep -x '.\{52\}' aleph_pc_user_05-02-2016.log | \
# grep -oE '[^ ]+
 | \
# grep -E '[0]{6}[0-9]{3}'
#
########################################################################

# Variablen

# Pfad zum pc_server-Log von Aleph
dateipfad="/exlibris/aleph/a22_1/log"
# aktuelles pc_server-Log von Aleph
dateiname="pc_server_6530.log"

# Pfad zum pc_server-Log fuer Nagios
logpfad="/home/nagios/nagios_scripts/pc_server_user/logs"
# aktuelles pc_server-Log fuer Nagios
logdatei="aleph_pc_user_`date +"%d-%m-%Y"`.log"

# suche das letzte Vorkommen des Strings im Log, der 'word count (wc)'
# muss groesser als eins sein, ansonsten wurde das Log vor zu kurzer
# Zeit neu angelegt oder es besteht ein anderer Fehler.
anzahl=`tac ${dateipfad}/${dateiname} | grep -m1 'Active GUI users  :' | wc -l`



# gibt es eine Zeile im Aleph log, die den String 'Active GUI users  :'
# enthaelt? Falls ja, pruefen wir die Zeile auf Korrektheit und
# schreiben diese, wenn korrekt ins Log fuer Nagios
if [ ${anzahl} -gt 0 ]; then

  # Auslesen der Zeile, letztes "Wort" in der Zeile sollte obige
  # Bedingungen der gepipten grep-Befehle erfuellen. Der awk-Befehl
  # macht daraus eine Zahl, die soll kleiner sein als 200. Ist die
  # Bedingung erfuellt, schreiben wir die Zeile ins Log fuer Nagios,
  # ansonsten wird kein Logeintrag geschrieben.
  #if [[ $(grep -x '.{52}' ${dateipfad}/${dateiname} | grep -oE '[^ ]+
 | grep -E '[0]{6}[0-9]{3}' | awk '{print $1+0}') -lt 200 ]]; then
  if [[ $(grep -x '.{52}' ${dateipfad}/${dateiname}) ]] && [[ $(grep -oE '[^ ]+
 ${dateipfad}/${dateiname} | grep -E '[0]{6}[0-9]{3}' | awk '{print $1+0}') -lt 200 ]]; then

    # Die Zeile im Aleph-Log ist
    #   - genau 52 Zeichen lang
    #   - das letzte Wort besteht aus sechs fuehrenden Nullen und
    #     enthaelt anschliessend drei beliebige Ziffern von 0 - 9
    #   - die sich daraus ergebende Zahl ist zudem kleiner als 200



########################################################################
# Anfang        "nur fuer Testzwecke"
########################################################################

    # Den kompletten String aus dem pc_server-Log auslesen
    #stringKomplett=`tac ${dateipfad}/${dateiname} | grep -m1 'Active GUI users  :'`
    # Die aktuelle Zahl noch als String aus dem pc_server-Log auslesen
    #zahlAlsString=`tac ${dateipfad}/${dateiname} | grep -m1 'Active GUI users  :' | grep -oE '[^ ]+
 | grep -E '[0]{6}[0-9]{3}'`
    # Die als String ausgelesene Zahl in eine Zahl umwandeln
    #zahl=`tac ${dateipfad}/${dateiname} | grep -m1 'Active GUI users  :' | grep -oE '[^ ]+
 | grep -E '[0]{6}[0-9]{3}' | awk '{print $1+0}'`

    # Ausgabe des kompletten und der Teilstrings
    #echo ${stringKomplett}
    #echo ${zahlAlsString}
    #echo ${zahl}

########################################################################
# Ende          "nur fuer Testzwecke"
########################################################################



    # Die korrekte Zeile muss noch ins Log geschrieben werden
    # Zeitstempel
    printf "`date +"%d-%m-%Y    %H:%M"`    " >> ${logpfad}/${logdatei}
    # Aktive User
    grep -F 'Active GUI users  :' ${dateipfad}/${dateiname} | tail -n1 >> ${logpfad}/${logdatei}

  # Falls die Zeile nicht den Erwartungen entspricht, wird nichts ins
  # Log geschrieben, kein else-Abschnitt noetig
  fi



# das else der aeusseren Schleife. Ist im pc_server-Log keine Zeile mit
# 'Active GUI users  :' vorhanden, wird fuer Nagios eine erstellt. Ist
# im Log fuer Nagios keine Zeile vorhanden, entstehen ansonsten
# unschoene Fehlermeldungen.
else
  # Zeitstempel
  printf "`date +"%d-%m-%Y    %H:%M"`    " >> ${logpfad}/${logdatei}
  # Aktive User
  echo "Active GUI users  : 000000000" | tail -n1 >> ${logpfad}/${logdatei}
fi

exit 0