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
Shell Programmierung

awk – Ändern der Großschreibung in Kleinbuchstaben

Die Funktion tolower in einem awk Skript ändert Grossbuchstaben in Kleinbuchstaben:

awk '{ print tolower($0) }'

Die Funktion toupper in einem awk Skript ändert Grossbuchstaben in Kleinbuchstaben:

awk '{ print toupper($0) }'

Beispiel für AWK Funktion tolower

In diesem Beispiel soll das erste Feld in Kleinbuchstaben ausgegeben werden.

echo ABCDEF GHIJK | awk '{ print tolower($1), $2 }'

abcdef GHIJK

Beispiel für AWK Funktion toupper

In diesem Beispiel soll das erste Feld in Kleinbuchstaben ausgegeben werden.

echo abcdef ghijk | awk '{ print toupper($1), $2 }'

ABCDEF ghijk

Categories
Shell Programmierung

Leerzeilen aus einer ASCII Datei entfernen

Um bei einer Dateianzeige die leeren Zeilen zu entfernen, gibt es verschiedene Möglichkeiten. Ich stelle hier 2 Methoden vor.

Variante 1 verwendet den Unix Befehl grep

grep -v ^$

Variante 2 verwender das Kommando awk.

awk ' NF>0 '

Beispiel für grep
Das verwendete Pattern setzt sich aus einem ^ für den Zeilenanfang und einem $ für das Zeilenende zusammen. Leerzeilen setzen sich ja, bei genauer Betrachtung, aus einem Zeilenanfang sofort gefolgt von einem Zeilenende zusammen.

echo "ABCDEF \n\n GHIJK \n\n\nXYZ" | grep -v ^$

ABCDEF
GHIJK
XYZ

Beispiel für awk

Beim awk wird die interne Variable NF verwendet. NF enth%auml;lt die Anzahl der Felder der aktuellen Zeile. Leerzeilen haben 0 Felder, so das mit der Ausgabe aller Zeilen mit mehr als 0 Feldern alle Leerzeilen entfernt werden.

echo "ABCDEF \n\n GHIJK \n\n\nXYZ" | awk ' NF>0 '

ABCDEF
GHIJK
XYZ