Categories
Debian Korn Shell / Bash Linux RedHat Ubuntu

Welcher Prozess belegt wieviel Swap?

Wenn die Kommandos (in den Linux Varianten Debian, Ubuntu, RedHat und ähnlich)

  free
  cat /proc/swaps
  swapon -s

eine hohe Auslastung des Swap Spaces anzeigen, kommt die Frage nach dem Verbraucher des Swap hoch.

Folgendes Miniskript gibt die Liste der Prozesse nach Größe des belegten Swap an. Mit der Variable THRESHOLD kann man die Liste auf die Verbraucher eingrenzen, die mehr als diesen Wert in kB an Swap belegen.

  THRESHOLD=5000
  for pid in `ls /proc`; do
    vmswap=`awk '/VmSwa/{print $2}' /proc/${pid}/status 2>/dev/null`;
    if [ ${vmswap} -gt ${THRESHOLD} ];then
      pName=`ps -ef|awk '$2=="'"${pid}"'" {print $8}'`;
      echo "PID ${pid}: ${vmswap} kB (${pName})";
    fi;
  done 2>/dev/null|sort -un -k3

Die Ausgabe sieht wie folgt aus:

  PID 123857: 7826 kB (/usr/bin/python)
  PID 768456: 9876 kB (/usr/bin/java)
  PID 6543: 11392 kB (/usr/bin/python)
  PID 367682: 12420 kB (/usr/bin/python)

Categories
Korn Shell / Bash Shell Programmierung

Mehrfache Einträge in großen Konfigurationsdateien oder Protokollen finden (Linux/Unix Lösung)

Oft vermutet man in größeren Protokolldateien oder Konfigurationsdateien mehrfach vorhandene Einträge. Diese sollen schnell ermittelt und bei Bedarf entfernt werden.
Unter Linux gibt es das Werkzeug uniq. Der Parameter --count gibt alle Zeilen aus und die Häufigkeit Ihres Auftretens in der ersten Spalte. Es funktioniert nur nicht so intuitiv, wie erwartet. Ich versuche es an einem Beispiel:

uniq –count console.log

1 <?xml version=”1.0″ encoding=”UTF-8″ ?>
1 <Protokollzeile xxxyyyzzz >

Diese Datei hat offensichtlich zwei Zeilen insgesamt und beide unterscheiden sich. Das ist im Moment nicht sehr hilfreich. Daher verdoppele ich die Datei und füge eine einzeln vorkommende Zeile hinzu:

cat console.log >> consoleDup.log
cat console.log >> consoleDup.log
echo “Eine abweichende Zeile >> consoleDup.log

Eine erneute Überprüfung mit uniq zeigt das Problem:

uniq –count consoleDup.log

1 <?xml version=”1.0″ encoding=”UTF-8″ ?>
1 <Protokollzeile xxxyyyzzz >
1 <?xml version=”1.0″ encoding=”UTF-8″ ?>
1 <Protokollzeile xxxyyyzzz >
1 Eine abweichende Zeile

Genau, das wollten wir so nicht sehen. Die erste und dritte Zeile und die zweite und vierte Zeile sind identisch. Da sollte eine 2 stehen.
Aus dem gleichen Grund funktioniert uniq --unique nicht, solange die Datei nicht sortiert vorliegt. In den meisten Fällen (XML, JSON etc) Dazeien würde die Sortierung die Datei unbrauchbar machen.

Zur Lösung des Problems müssen die Zeilen sortiert werden.

sort consoleDup.log|uniq –count

1 Eine abweichende Zeile
2 <?xml version=”1.0″ encoding=”UTF-8″ ?>
2 <Protokollzeile xxxyyyzzz >

Schon besser. Der uniq Parameter --repeated gibt nur die mehrfach vorkommenden Zeilen aus:

sort consoleDup.log|uniq –count –repeated

2 <?xml version=”1.0″ encoding=”UTF-8″ ?>
2 <Protokollzeile xxxyyyzzz >
Doppelt oder noch häufiger vorkommende Zeilen in Textdaten können schnell und elegant mit awk entfernt werden:

awk ‘!seen[$0]++’ consoleDup.log >> console_noDupRecords.log
cat console_noDupRecords.log

<?xml version=”1.0″ encoding=”UTF-8″ ?>
<Protokollzeile xxxyyyzzz >

Eine Lösung für die Powershell zeige ich hier.

Categories
Korn Shell / Bash

Zeichen aus Zeichenketten mit bash/ksh schneiden

Mit bash oder Korn Shell kann man auf einfachem Wege Zeichen in Zeichenketten ermitteln, bzw. herausschneiden. Dazu ist einfach nach einer Variable mit : getrennt die erste zu ermittlende Position anzugeben, gefolgt von einem weiteren : mit der Anzahl der auszugebenden Zeichen.
${VARIABLENAME:<erstes Zeichen>:<Anzahl>}

Beispiel:
TEXT="Holger Slomka"

echo ${TEXT:2:3}

lge

Ein Beispiel für eine mögliche Verwendung, ist die Ausgabe aller Zeilen einer Datei, die nicht mit # beginnen.

for Zeile in `cat inifile| cut -d’ ‘ -f1`; do
if [[ ${Zeile:0:1} != “#” ]]; then
  echo $Zeile/span>
fi
done

Es werden also Kommentarzeilen ausgeblendet, analog grep -v ^#.

Categories
Korn Shell / Bash Shell Programmierung

Sehr nützliche grep Funktionen

grep wird von Linuxx/Unix Administratoren zwar sehr oft genutzt, einige sehr mächtige Optionen werden aber zu Unrecht wenig genutzt oder sind den Administratoren nicht bekannt.

1. Zeilen vor und nach der Fundstelle des Suchbegriffs ausgeben.
grep bietet die äusserst nützliche Funktion, Zeilen vor und nach dem gefundenen Suchbegriff anzuzeigen.

Um die Funktionen der grep Optionen darzustellen, verwende ich als Beispiel ein IBM Skript mit folgendem Inhalt, das von grep durchsucht wird:

cat collector.sh

#!/bin/sh
binDir=`dirname ${0}`
. ${binDir}/setupCmdLine.sh
${WAS_HOME}/bin/collector.sh “$@”

Die Option -A zeigt n Zeilen nach der Fundstelle an.

grep -A 1 setup collector.sh

. ${binDir}/setupCmdLine.sh
${WAS_HOME}/bin/collector.sh “$@”

Die Option -B zeigt n Zeilen vor der Fundstelle an.

grep -B 1 setup collector.sh

binDir=`dirname ${0}`
. ${binDir}/setupCmdLine.sh

Die Option -C zeigt n Zeilen vor und nach der Fundstelle an.

grep -C 1 setup collector.sh

binDir=`dirname ${0}`
. ${binDir}/setupCmdLine.sh

2. Farbliches Hervorheben des Suchbegriffs in den Fundstellen
grep kann in einem Terminal den gefundenen Suchbegriff farblich hervorheben. Dazu setzt man die Umgebungsvariable GREP_OPTIONS wie folgt:

export GREP_OPTIONS='--color=auto'

–color=always

wird oft in Blogs erwähnt, aber grep soll die Farben ja nur in interaktiven Terminals hervorheben. Daher empfehle ich die Option --color=auto. Am besten setzt man diese Umgebungsvariable in den Login Dateien (z.B. .bashrc).

3. Nur den Dateinamen mit der Fundstelle bei Suchen in mehreren Dateien ausgeben
grep ermöglicht Suchen in mehreren Dateien und auch rekursiv (Option -r) in Unterverzeichnissen. Wenn der Suchbegriff in vielen Dateien an mehreren Positionen enthalten ist, wird das Ergebnis
schnell unübersichtlich. Die grep Option -l bietet sich in diesen Fällen an. Sie gibt nicht die Zeile mit der Fundstelle aus, sonder zeigt nur den Dateinamen an.

grep -rl suchstring *

Categories
Korn Shell / Bash Shell Programmierung

Zeichenketten in mehreren Dateien und Verzeichnissen suchen

Unter Unix bietet grep eine einfache Lösung um Zeichenketten in Dateien zu finden. Möchte man in allen Dateien eines Verzeichnisses und den Unterverzeichnissen eine bestimmte Zeichenkette (z.B BLABLA) suchen, so reicht der Befehl

grep BLABLA *

nicht, da keine Unterverzeichnisse durchsucht werden. Eine Alternative ist die Kombination aus den Befehlen: find, xargs und grep.

find . -type file | xargs grep -i BLABLA
find . -type file -print | xargs grep -i BLABLA

egrep ist eine weitere mächtige Alternative. Mit der Option -R ist es in der Lage rekursiv Unterverzeichnisse zu durchsuchen:

egrep -R BLABLA *

Das funktioniert auch Super in der Windows bash!

Allerdings kann man grep nicht auf binäre Dateien anwenden. In diesem Fall hilft der Befehl strings weiter.

strings binary_file | grep BLABLA

Die Datei binary_file sei eine binäre Datei.