bash – Finn Christiansen https://blogarchive.finnchristiansen.de Softwareentwickler mit einer Vorliebe für freie Software und GNU / Linux Sat, 08 Dec 2018 16:50:58 +0000 de-DE hourly 1 https://wordpress.org/?v=5.1.1 https://blogarchive.finnchristiansen.de/wp-content/uploads/2017/01/cropped-FinnsBlog512-32x32.png bash – Finn Christiansen https://blogarchive.finnchristiansen.de 32 32 Kleine Scripte auf GitHub https://blogarchive.finnchristiansen.de/2016/09/03/kleine-scripte-auf-github/ https://blogarchive.finnchristiansen.de/2016/09/03/kleine-scripte-auf-github/#respond Sat, 03 Sep 2016 08:52:46 +0000 https://www.finnchristiansen.de/?p=164 Continue reading ]]> Mit der Zeit sammeln sich bei mir kleine Scripte an, die ich hin und wieder für kleinere Aufgaben benötige. Manchmal ist es sogar nur ein Einzeiler, den ich mir nicht merken kann, manchmal ist es etwas mehr. Leider lagen diese Scripte bei mir bisher Kreuz und Quer verteilt herum, weshalb ich so langsam ein wenig Ordnung schaffen möchte und daher die Scripte nach und nach in mein GitHub Repository tiny-scripts einfüge.

Es ist zwar noch nicht viel zusammen gekommen, aber für MySQL- und PostgreSQL Backups, selbst signierte SSL Zertifikate und TLSA Records und für das Hinzufügen von Erinnerungen zu ICS Dateien ist etwas enthalten. Wie gesagt, teilweise sind es nur Einzeiler, aber das eine oder andere vergesse ich hin und wieder gerne.

Das auto_shutdown.sh Script beispielsweise muss definitiv noch angepasst werden, bevor man es einsetzt. Es kann eine Liste von Hosts angegeben werden, die nacheinander angepingt werden und sollte keiner der Hosts antworten, fährt der Rechner herunter. Optional kann noch der RAID Status vor dem Herunterfahren überprüft werden, um ein Herunterfahren mit einem nicht fehlerfreien RAID zu vermeiden.

Vielleicht kann jemand den einen oder anderen Schnipsel gebrauchen.

]]>
https://blogarchive.finnchristiansen.de/2016/09/03/kleine-scripte-auf-github/feed/ 0
Zeilen einer Datei zählen und nach Häufigkeit sortieren https://blogarchive.finnchristiansen.de/2016/08/05/zeilen-einer-datei-zaehlen-und-nach-haeufigkeit-sortieren/ https://blogarchive.finnchristiansen.de/2016/08/05/zeilen-einer-datei-zaehlen-und-nach-haeufigkeit-sortieren/#comments Fri, 05 Aug 2016 05:27:56 +0000 https://www.finnchristiansen.de/?p=157 Continue reading ]]> Was ein wenig wie eine Excel Problemstellung klingt, erledigt der geübte GNU / Linux Anwender in der Shell schnell und einfach mit den GNU coreutils sort und uniq. Mit den beiden Anwendungen lassen sich zwar noch jede Menge weiterer Probleme lösen, aber da ich dieses Kommando in den letzten Jahren gefühlt recht häufig gebraucht habe, möchte ich es hier kurz festhalten.

Als Beispiel dient eine Textdatei mit folgendem Inhalt:

rot
blau
rot
rot
gruen
gelb
blau
rot
lila
blau

Was hier ein paar Farben sind, können in der Praxis Ausschnitte aus Log-Dateien, Spalten von CSV Dateien oder Ähnliches sein. Möchte man nun die Häufigkeiten der Farben zählen und entsprechend sortieren, muss zuerst die Datei selbst sortiert werden (

sort testfile.txt
). Die Zeilen werden gezählt und doppelte Einträge entfernt (
uniq -c
), die Häufigkeit wird an den Anfang der Zeile geschrieben. Am Ende wird das Ergebnis noch einmal nach der Häufigkeit, die am Anfang der Zeile steht, in absteigender Reihenfolge sortiert (
sort -nr
).

Das vollständige Kommando ist eigentlich recht überschaubar und liefert folgendes Ergebnis:

sort testfile.txt | uniq -c | sort -nr
      4 rot
      3 blau
      1 lila
      1 gruen
      1 gelb

]]>
https://blogarchive.finnchristiansen.de/2016/08/05/zeilen-einer-datei-zaehlen-und-nach-haeufigkeit-sortieren/feed/ 1
Große Dateien und Verzeichnisse unter Linux finden https://blogarchive.finnchristiansen.de/2016/08/03/grosse-dateien-und-verzeichnisse-unter-linux-finden/ https://blogarchive.finnchristiansen.de/2016/08/03/grosse-dateien-und-verzeichnisse-unter-linux-finden/#comments Wed, 03 Aug 2016 17:34:48 +0000 https://www.finnchristiansen.de/?p=151 Continue reading ]]> Wenn eine Partition einer Festplatte plötzlich ungewöhnlich voll ist, beginnt die Ursachensuche. Nicht immer stehen grafische Hilfsmittel zur Verfügung oder gar ein Paketmanager, mit dem Tools genau für diesen Zweck nachinstalliert werden könnten. Auf den meisten Distributionen steht aber
du
  (disk usage – GNU coreutils) zur Verfügung. Mit den passenden Parametern ist
du
  ein äußert praktisches Werkzeug.

Ohne Parameter aufgerufen zeigt

du
die Größe bzw. die Plattenbelegung des aktuellen Arbeitsverzeichnisses an und bezieht dabei rekursiv Unterverzeichnisse mit ein. Um das zu veranschaulichen, habe ich ein Testverzeichnis mit einigen Dateien und einem Unterverzeichnis mit wiederum einigen Dateien angelegt:

ls -l
insgesamt 1444
-rw-r--r-- 1 finn finn   32768  6. Jun 11:21 test1
-rw-r--r-- 1 finn finn   49152  6. Jun 11:21 test2
-rw-r--r-- 1 finn finn 1048576  6. Jun 11:21 test3
-rw-r--r-- 1 finn finn    4096  6. Jun 11:22 test4
-rw-r--r-- 1 finn finn  102400  6. Jun 11:22 test5
-rw-r--r-- 1 finn finn  204800  6. Jun 11:22 test6
-rw-r--r-- 1 finn finn   21504  6. Jun 11:22 test7
-rw-r--r-- 1 finn finn    5120  6. Jun 11:22 test8
drwxr-xr-x 2 finn finn    4096  6. Jun 11:23 testdir

Ruft man

du
  in diesem Verzeichnis nun auf, wird folgendes gezeigt:

du
556    ./testdir
2000    .

Die links angezeigten Größen sind in Kilobyte angegeben. Die Gesamtgröße beträgt also 2000 KB, wovon 556 auf das Unterverzeichnis

testdir
  entfallen. Bei vielen Unterverzeichnissen ist die Ausgabe vielleicht etwas lang und man möchte nur das Endergebnis angezeigt bekommen. Ebenso ist die Anzeige in Kilobyte nicht immer optimal und man möchte eine passende Einheit verwenden:

du -sch
2,0M .
2,0M insgesamt

Das sieht schon recht brauchbar aus. Wenn man jetzt die größten Dateien im Unterverzeichnis finden möchte, kann

du
  auch mit
sort
  kombiniert werden:

du -a | sort -n
4    ./test4
8    ./test8
24    ./test7
24    ./testdir/test9
32    ./test1
36    ./testdir/test11
48    ./test2
56    ./testdir/test12
100    ./test5
200    ./test6
436    ./testdir/test10
556    ./testdir
1024    ./test3
2000    .

Der Parameter

-a
  zeigt auch Dateien in der Ausgabe an und mit sort
-n
  werden die numerischen Größenangaben zur Sortierung genutzt.

Bei sehr vielen Dateien ist es vielleicht sinnvoll, die Ausgabe mit

tail
  ein wenig zu beschränken:

du -a | sort -n | tail -5
200 ./test6
436 ./testdir/test10
556 ./testdir
1024 ./test3
2000 .

Anstelle der 5 kann natürlich ein beliebiger Wert eingesetzt werden. Kehrt man die Sortierreihenfolge um und nutzt

head
  anstelle von
tail
 , einsteht eine Art Topliste der größten Dateien und Verzeichnisse, was mein persönlicher Favorit ist:

du -a | sort -nr | head -5
2000    .
1024    ./test3
556    ./testdir
436    ./testdir/test10
200    ./test6

Wie man sieht, lässt sich mit diesen wenigen Befehlen schon eine Menge erreichen. Aber auch

ls
  kann ein wenig dabei helfen, große Dateien in einem Verzeichnis (allerdings ohne Rekursion / Unterverzeichnisse) zu finden:

ls -lS
insgesamt 1444
-rw-r--r-- 1 finn finn 1048576  6. Jun 11:21 test3
-rw-r--r-- 1 finn finn  204800  6. Jun 11:22 test6
-rw-r--r-- 1 finn finn  102400  6. Jun 11:22 test5
-rw-r--r-- 1 finn finn   49152  6. Jun 11:21 test2
-rw-r--r-- 1 finn finn   32768  6. Jun 11:21 test1
-rw-r--r-- 1 finn finn   21504  6. Jun 11:22 test7
-rw-r--r-- 1 finn finn    5120  6. Jun 11:22 test8
-rw-r--r-- 1 finn finn    4096  6. Jun 11:22 test4
drwxr-xr-x 2 finn finn    4096  6. Jun 11:23 testdir

Eine weitere Alternative ist

find
 , welches man nutzen kann, um Dateien ab einer bestimmten Größe, hier beispielsweise ab 100 KB, zu finden:

find -size +100k ./test6 ./testdir/test10 ./test3

Wer es ein wenig komortabler haben möchte, sollte ich ncdu  ansehen, von dem ich einmal im fryboyter.de ncdu Beitrag gelesen habem.

]]>
https://blogarchive.finnchristiansen.de/2016/08/03/grosse-dateien-und-verzeichnisse-unter-linux-finden/feed/ 8
Datenströme STDOUT und STDERR umleiten und mit Bash, Python oder PHP ausgeben https://blogarchive.finnchristiansen.de/2016/06/30/datenstroeme-stdout-und-stderr-umleiten-und-mit-bash-python-oder-php-ausgeben/ https://blogarchive.finnchristiansen.de/2016/06/30/datenstroeme-stdout-und-stderr-umleiten-und-mit-bash-python-oder-php-ausgeben/#respond Thu, 30 Jun 2016 17:26:57 +0000 https://www.finnchristiansen.de/?p=141 Continue reading ]]> Als Linux Anweder oder Nutzer sonstiger unixoider System ist man wahrscheinlich mit dem Konzept der Standard-Datenströme vertraut. Gemeint sind damit die Standardeingabe STDIN, Standardausgabe STDOUT und Standardfehlerausgabe STDERR. Besonders die Ausgaben STDOUT und STDERR beschäftigen mich regelmäßig, weshalb ich hier kurz ein Beispiel für Bash, Python und PHP zeigen möchte und wie man STDOUT und STDERR sinnvoll umleitet.

Natürlich darf ich die Standardeingabe nicht vergessen zu erwähnen, aber ein kurzes Beispiel sollte genügen:

# mit grep nach foobar in der Datei test.log suchen
grep foobar < test.log
# oder etwas alltagstauglicher: einen MySQL Dump einspielen
mysql -h server -u user -p < dump.sql

Ich muss zugeben, dass das grep-Beispiel nicht allzu gut ist, denn normalerweise lässt man das Kleiner-als-Zeichen

<
  weg, da grep nicht nur aus der Standardeingabe lesen, sondern auch direkt in Dateien suchen kann. Das zweite Beispiel, in dem mysql einen MySQL Dump aus der Standardeingabe liest, macht in der Praxis schon ein wenig mehr Sinn.

Die Standard(fehler)ausgabe verwende ich recht häufig, da die Unterscheidung zwischen normalen Ausgaben und Fehlern in vielen Situationen sehr hilfreich ist. Die Ausgabe einer Datei kann man mit dem Größer-als-Zeichen

>
  umleiten. Das Ziel der Umleitung kann eine gewöhnliche Datei oder ein sonstiger Dateideskriptor (z.B. /dev/null oder STDOUT) sein.

Ein einzelnes Größer-als-Zeichen überschreibt den eventuell vorhandenen Inhalt einer Datei, ein doppeltes Größer-als-Zeichen

>>
  hängt die Ausgabe an die Datei an. Falls die Datei noch nicht exisitert, wird Sie erstellt, insofern das Verzeichnis existiert.

Meistens habe ich mit Bash-, Python- oder PHP-Skripten zu tun, weshalb ich für diese Sprachen je ein kleines Beispiel für das Schreiben in STDOUT (sollte ja bereits bekannt sein) und STDERR zeige. Wer kein komplexes Logging einsetzen möchte, sondern nur zwischen normalen Meldungen und Fehlermeldungen unterscheiden möchte, sollte sich die gelegentliche Verwendung von STDERR angewöhnen.

Bash

#!/bin/bash
echo "Eine informative Meldung in STDOUT";
>&2 echo "Ein Fehler in STDERR";

Python

#!/usr/bin/env python
import sys

print("Eine informative Meldung in STDOUT")
sys.stdout.write("Auch eine informative Meldung in STDOUT\n")
sys.stderr.write("Ein Fehler in STDERR\n")

PHP

#!/usr/bin/php
<?php
print "Eine informative Meldung in STDOUT\n";
fwrite(STDOUT, "Auch eine informative Meldung in STDOUT\n");
fwrite(STDERR, "Ein Fehler in STDERR\n");
?>

Da diese Skripte nun Ausgaben in STDOUT und STDERR erzeugen, kann man anfangen, die Ausgaben umzuleiten oder unterschiedlich zu behandeln.

Nur STDOUT nach /dev/null umleiten (praktisch für Cronjobs)

./test.py > /dev/null

Alles nach /dev/null umleiten (alle Ausgaben unterdrücken)

./test.py > /dev/null 2>&1

STDOUT nach /dev/null umleiten, STDERR loggen

./test.py > /dev/null 2> error.log

STDOUT und STDERR in separate Dateien loggen

./test.py > info.log 2> error.log

Um die alten Log-Dateien nicht zu überschreiben, können zwei Größer-als-Zeichen verwendet werden:

./test.py >> info.log 2>> error.log

STDOUT und STDERR in separate Dateien loggen, aber STDERR zusätzlich ausgeben (sehr praktisch bei Cronjobs)

./test.py >> info.log 2> >(tee -a error.log >&2)

Mit den genannten Mitteln ist man nun in der Lage, sinnvoll mit Ausgaben umzugehen und ich selbst habe nun eine kleine Gedächtnisstütze, denn auch ich muss des Öfteren etwas nachschlagen, wenn ich es eine Weile nicht benötigt habe.

]]>
https://blogarchive.finnchristiansen.de/2016/06/30/datenstroeme-stdout-und-stderr-umleiten-und-mit-bash-python-oder-php-ausgeben/feed/ 0