Kategorie: Bash Snippets

  • Führende Nullen in Dateinamen unter Linux hinzufügen

    Wenn Sie viele Dateien haben, die durchnummeriert sind, aber ohne führende Nullen, kann die Sortierung manchmal durcheinander geraten. Ein typisches Beispiel könnte eine Sammlung von Bilddateien sein, die als img_1.jpg, img_2.jpg, img_100.jpg usw. nummeriert sind. In diesem Fall wird img_100.jpg vor img_2.jpg sortiert, da die Sortierung als Zeichenkette und nicht numerisch erfolgt.

    Dieses Problem lässt sich lösen, indem man ein einfaches Bash-Skript verwendet, das durch alle Dateien geht und diejenigen umbenennt, die weniger als eine bestimmte Anzahl von Ziffern in ihrem Namen haben, in unserem Fall drei. Hier ist, wie Sie das tun können:

    for file in img_*.jpg; do
        # Extrahiere die Nummer aus dem Dateinamen
        num=$(echo $file | grep -o -E '[0-9]+')
    
        # Überprüfe, ob die Nummer weniger als 3 Stellen hat
        if [ ${#num} -lt 3 ]; then
            # Füge führende Nullen hinzu, um die Länge auf 3 zu bringen
            new_num=$(printf "%03d" $num)
    
            # Generiere den neuen Dateinamen
            new_file="img_${new_num}.jpg"
    
            # Umbenennen der Datei
            mv $file $new_file
        fi
    done
    

    Dieses Skript extrahiert den numerischen Teil jedes Dateinamens, prüft seine Länge und fügt gegebenenfalls führende Nullen hinzu, um die Länge auf drei Stellen zu bringen. Es ignoriert Dateien, die bereits eine dreistellige Nummer haben.

    Bitte beachten Sie, dass das Skript davon ausgeht, dass alle Ihre Dateien im Format img_N.jpg vorliegen, wobei N eine Zahl ohne führende Nullen ist. Wenn Ihr Dateiformat abweicht, müssen Sie das Skript entsprechend anpassen.

    Zudem sollten Sie beachten, dass dieses Skript keine Sicherheitsmaßnahmen implementiert, um sicherzustellen, dass keine Dateien überschrieben werden. Stellen Sie daher sicher, dass Sie eine Sicherungskopie Ihrer Dateien haben, bevor Sie das Skript ausführen.

  • Ändern der Zeitzone auf einem Debian System

    Um die Zeitzone auf einem Debian System zu ändern, können Sie die folgenden Schritte ausführen:

    1. Öffnen Sie das Terminal oder eine SSH-Verbindung zum Server.
    2. Überprüfen Sie die aktuelle Zeitzone des Systems mit dem Befehl timedatectl.
    3. Geben Sie den Befehl timedatectl set-timezone gefolgt von der Bezeichnung der neuen Zeitzone ein, um die Zeitzone zu ändern.
    4. Ersetzen Sie „Europe/Berlin“ durch den Namen der gewünschten Zeitzone. Eine Liste aller verfügbaren Zeitzone finden Sie unter /usr/share/zoneinfo/.
    5. Überprüfen Sie erneut die Zeitzone mit dem Befehl „timedatectl", um sicherzustellen, dass die Änderung erfolgreich war.

    Stellen Sie sicher, dass Sie über ausreichende Berechtigungen auf dem System verfügen, um diese Änderungen vorzunehmen

  • Dateien älter als ein bestimmtes Datum unter Linux löschen

    Verwenden Sie den folgenden Befehl, um Dateien zu finden und zu löschen, die älter sind als ein bestimmtes Datum:

    find /pfad/zum/verzeichnis -type f -not -newermt 'YYYY-MM-DD' -print0 | xargs -0 rm

    Bevor Sie den Befehl ausführen, empfiehlt es sich, die gefundenen Dateien ohne den | xargs -0 rm-Teil zu überprüfen, dass wirklich nur die gewünschten Daten gelöscht werden.

  • Anonymisieren von IP-Adressen in einer Apache Log Datei mithilfe von sed

    Ziel: Man möchte die IP-Adressen in einer Apache Logdatei anonymisieren, indem man das letzte Byte oder die zwei letzten Byte der IP-Adresse durch 0 ersetzt.

    Lösungsmöglichkeit: Zeilenweises Durchsuchen der Logdatei mit dem Unix Werkzeug sed. Suchen der IP-Adressen und Ersetzen der Fundstellen mit der anonymiserten IP-Adresse.
    Z. B. soll die IP-Adresse 123.123.123.123 durch die Adresse 123.123.0.0 ersetzt werden.

    Dazu kann man folgenden Einzeiler verwenden:

    sed -i -e 's/\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)/\1\.\2\.0\.0/' access_log_ssl.log

    Hier der Versuch einer Erklärung, ohne zu tief auf die regulären Ausdrücke, die in dem sed-Skript verwendet werden, einzugehen.

    Vereinfacht sieht das sed-Skript wie folgt aus:

    sed -i -e 's/SUCHMUSTER/ERSETZUNG/g' access_log.log

    -e = Parameter der angibt, dass ein sed-Script folgt
    ’s/SUCHMUSTER/ERSETZUNG/g‘ = sed-Skript
    SUCHMUSTER = Muster, nach dem gesucht werden soll
    ERSETZUNG = Text, mit dem das Suchmuster ersetzt werden soll
    access_log.log = Eingabedatei
    -i = Inplace Bearbeitung – die Änderungen werden direkt an der Eingabedatei ausgeführt

    Sollen die Änderungen in einer Kopie gespeichert werden, dann wird sed ohne den -i Parameter benutzt und die Ausgabe in eine neue Datei umgeleitet.

    sed -e 's/SUCHMUSTER/ERSETZUNG/g' access_log.log > bearbeitet.log

    In diesem Fall bleibt die Eingabedatei unverändert und die Änderungen werden in der Datei bearbeitet.log gepeichert.

    Jetzt zu dem konkreten Beispiel:

    Der besseren Lesbarkeit halber wurden die vielen Maskierungen mit dem Zeichen \ entfernt. Diese werden aber in dem eigentlichen sed-Skript benötigt.

    Hier das Suchmuster in unserem sed-Skript:

    ([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})

    [0-9] = Die Zeichen 0-9, also 0123456789 werden an dieser Stelle gesucht
    {1,3} = Die Zeichen [0-9] müssen 1 bis 3 mal auftreten
    ([0-9]{1,3}) = Die Klammern kennzeichnen eine Einheit in dem Suchmuster, auf die anschließend beim Ersetzten zugegriffen werden kann
    ([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}) = Das Muster muss vier Mal, getrennt duch einen Punkt, hintereinander auftreten.

    Damit hat man aber keine hundertprozentige Sicherheit, dass nur gültige IPv4 Adressen von dem Suchmuster gefunden werden. Ungültige Adressen wie z.B. 999.999.999.999 würden duch das Suchmuster auch gefunden.
    Für unseren Anwendungsfall reicht das vereinfachte Suchmuster aber vollkommen aus.

    Jetzt zu dem ersetzen Teil des sed-Skripts. Auch hier sind die Maskierungen durch das Zeichen \ weggelassen.

    \1.\2.0.0

    \1 = Die erste mit Klammern definierte Einheit im Suchmuster
    \2 = Die zweite mit Klammern definierte Einheit im Suchmuster; analog dazu könnte man noch \3 und \4 für die dritte und vierte Einheit im Suchmuster benutzen. \1.\2.\3.\4 würde die ursprüngliche IP unverändert ausgeben.
    0 = Die Ziffer 0

    Der Ersetzen-Teil des sed-Skripts bedeutet also, dass eine gefundene IP-Adresse mit ihren ersten zwei Bytes und mit einer Null als drittes und viertes Byte ersetzt werden sollen.

  • Aktivieren des Bash-Completion-Features auf einem Debian-System

    Wenn das Bash-Completion-Feature auf Debian-Systemen richtig funktioniert, kann man z. B. die Dienste beim Service-Kommando mit der Tabulatortaste vervollständigen.

    Beispiel für die Befehlsvervollständigung:

    service ap<Tab>
    service apache2 rel<Tab>
    service apache2 reload

    Wenn auf einem Debian-System die Vervollständigung von Befehlen mittels der Tabulatortaste nicht funktioniert, kann es sein, dass das Paket Bash-Completion nicht installiert ist.

    Um zu überprüfen, ob das Bash-Completion-Paket installiert ist, kann man folgenden Befehl benutzen:

    dpkg -l bash-completion | tail -1

    Die Ausgabe des Befehls sollte dann wie folgt aussehen:

    ii  bash-completion 1:2.0-1 all programmable completion for the bash shell

    Bleibt diese Ausgabe leer, dann ist das Paket Bash-Completion nicht installiert. Es lässt sich mit folgendem Befehl installieren:

    apt-get install bash-completion

    Sollte die Bash-Vervollständigung trotz installiertem Paket Bash-Completion nicht funktionieren, kann es daran liegen, dass das Vervollständigungs-Feature noch nicht aktiviert wurde. Bei Debian kann man diese Funktion in der Datei /etc/bash.bashrc aktivieren. Man muss nur die Kommentarzeichen vor folgenden Zeilen entfernen:

    ###Vorher
    #if ! shopt -oq posix; then
    #  if [ -f /usr/share/bash-completion/bash_completion ]; then
    #    . /usr/share/bash-completion/bash_completion
    #  elif [ -f /etc/bash_completion ]; then
    #    . /etc/bash_completion
    #  fi
    #fi
    
    ###Nachher
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

    Damit diese Einstellung aktiv wird, muss man sich am System ab- und wieder anmelden.

    Quelle: http://serverfault.com

  • Sortierte Ausgabe von du -h (Kombinieren von du -h und sort)

    Eine Ergänzung zu dem Artikel „Unter Linux eine Liste der größten Dateien ausgeben

    Ich habe schon öfters nach einer Möglichkeit gesucht, die Ausgabe des Linux-Befehls du mit dem Parameter „-h“ (für human-readable) sortiert nach der Größe ausgeben zu lassen. Sortieren ohne die Option „-h“ ist kein Problem. Dann wird die Ausgabe von du standardmäßig nach KB sortiert.

    du /var --max-depth=1 |sort -nr
    686528 /var
    575840 /var/lib
    62848 /var/log
    46628 /var/cache
    872 /var/adm
    156 /var/spool
    128 /var/run
    28 /var/lock
    8 /var/tmp
    4 /var/X11R6
    4 /var/opt
    4 /var/games
    4 /var/crash

    Mit dem Parameter –block-size=1M oder  –block-size=1G kann man noch die Einheit der Größenangabe festlegen.

    du /var --block-size=1M --max-depth=1 |sort -nr
    
    6729 /var
    5237 /var/lib
    1021 /var/cache
    412 /var/log
    54 /var/www
    7 /var/backups
    1 /var/tmp
    1 /var/spool
    1 /var/opt
    1 /var/mail
    1 /var/local

    Was aber immer noch fehlt ist die sortierte Ausgabe mit flexiblen, je nach Ordnergröße angepassten, „Human Readable (wie KB MB GB)“ Größenangaben. Dies lässt sich durch eine Kombination von du sort cut xargs und wieder du erreichen.

    du  /var/ --max-depth=1 | sort -nr | cut -f2 | xargs -n 1 du -hs
    
    6,6G    /var/
    5,2G    /var/lib
    1023M   /var/cache
    413M    /var/log
    54M     /var/www
    6,5M    /var/backups
    72K     /var/spool
    4,0K    /var/tmp
    4,0K    /var/opt
    4,0K    /var/mail
    4,0K    /var/local
  • E-Mail versenden per Bash Shell Script

    Ich war gerade mal wieder auf der Suche nach dem Syntax, um per Linux Bash Shell eine Mail zu versenden:

    Direkte Eingabe des Mailtextes:

    echo "MAILTEXT" | mail -s "BETREFF" EMPFÄNGERADRESSE

    z.B.

    echo "Das ist der Text der Testemail" | mail -s "Das ist der Betreff der Testemail" user@example.com

    Mailtext aus einer Datei:

    mail -s "BETREFF" EMPFÄNGERADRESSE < DATEI

    z.B.

    mail -s "Ich bin eine Mail" user@example.com < /etc/hosts

    Quelle: http://www.linux-club.de

  • Unter Linux eine Liste der größten Dateien ausgeben

    Folgende Problemstellung: Es soll unter Linux eine nach Dateigröße sortierte Liste von Dateien ermittelt werden, die eine bestimmte Größe überschreiten.

    find /srv -type f -size +50000k

    Mit dem Find-Befehl wird eine Liste aller Dateien im Verzeichnis /srv und den darin enthaltenen Unterverzeichnissen ermittelt, die größer als 50000 Kb sind. Das Ergebnis ist noch nicht ganz zufriedenstellend, da nur die Dateien ausgegeben werden, nicht aber ihre Größe. Ebenfalls sind die Dateien noch nicht sortiert. Dies lässt sich erreichen, indem man das Ergebnis des Find-Befehls mithilfe des Befehls xargs mit dem ls Befehl kombiniert.

    find /srv -type f -size +50000k| xargs ls -lahS

    Jetzt erhält man die gewünschte Liste mit den Dateien im Verzeichnis /srv, die größer als 50000Kb sind – sortiert nach der Dateigröße.

  • Minimal CPU Benchmark für Linux

    Nachdem ich heute zwei unterschiedliche virtuelle Server von Strato geordert hatte, suchte ich nach einer Möglichkeit, mit wenig Aufwand die CPU-Leistung der virtuellen Server zu vergleichen. Im Forum www.linux-club.de fand ich einen Einzeiler, mit dem die Zeit ermittelt wird, die Zahl Pi auf 1000 Stellen zu berechnen.

    time echo "scale=1000; 4*a(1)" | bc -l

    Hier noch ein paar Ergebnisse:

    Root KVM vServer Netcup S v6
    4,99€ / Monat
    40GB HD RAID1
    2GB RAM
    1 vCore  Westmere E56xx/L56xx/X56xx (Nehalem-C) cpu MHz : 2000.000

    (25.08.2015)
    real 0m0.613s
    user 0m0.592s
    sys 0m0.016s

    (29.10.2015)
    real 0m0.631s
    user 0m0.620s
    sys 0m0.004s

    (29.10.2016)
    real 0m0.660s
    user 0m0.628s
    sys 0m0.028s

    Root Server Linux Small (bkm-v1411.1.29)  (Hardware)
    19,00 €/Monat
    500GB HD Raid 1
    4 GB Ram
    Dual-Core AMD Opteron(tm) Processor 1214 HE cpu MHz : 1000.000

    (29.12.2014)
    real 0m0.764s
    user 0m0.760s
    sys 0m0.000s

    (29.10.2015)
    real 0m0.763s
    user 0m0.756s
    sys 0m0.000s

    Strato Virtual Server Linux V20-49 (1609.1de)
    10,00€/Monat
    300GB HDD
    Min 2GB RAM, max 4GB RAM
    2 vCores (Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz  cpu MHz:1998.828 )

    (29.10.2016)
    real 0m0.376s
    user 0m0.375s
    sys 0m0.000s

     

    Virtual Server Linux Level 1 Site (Wandel.1406.ERG)
    8,99 €/Monat
    200GB HDD
    Min 2GB RAM, max 4GB RAM
    2 vCores (Quad-Core AMD Opteron(tm) Processor 2347 HE cpu MHz : 379.443)

    (29.12.2014)
    real 0m2.272s
    user 0m0.932s
    sys 0m0.004s

     

    Virtual Server Linux Level 1 Site (Wandel.1406.ERG)
    8,99 €/Monat
    200GB HDD
    Min 2GB RAM, max 4GB RAM
    2 vCores (Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz cpu MHz : 239.648)

    (29.12.2014)
    real 0m2.638s
    user 0m1.069s
    sys 0m0.005s

    (29.10.2016)
    aktuelle CPU MHz: 1998.828!!!
    real 0m0.412s
    user 0m0.394s
    sys 0m0.012s

     

    Virtual Server Linux Level 1 Site (Wandel.1406.ERG)
    8,99 €/Monat
    200GB HDD
    Min 2GB RAM, max 4GB RAM
    2 vCores (Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz cpu MHz : 559.179)

    (29.12.2014)
    real 0m1.032s
    user 0m0.388s
    sys 0m0.044s

    (29.10.2015)
    real 0m1.100s
    user 0m0.394s
    sys 0m0.000s

    Strato Virtual Server Linux Level 1 (v1304.1)
    7,99 €/Monat
    50GB HDD
    Min 1GB RAM, max 2GB RAM
    1 x Quad-Core AMD Opteron(tm) Processor 2347 HE 1425.000 MHz (physikalische CPU, nicht die nutzbaren Kerne)

    (31.10.2013)
    real 0m1.225s
    user 0m0.921s
    sys 0m0.005s

    Strato Virtual Server Linux Level 2UP
    14,90 €/Monat
    100GB HD
    Min 2GB RAM, max 4GB RAM
    1 x Octo-Core AMD Opteron(tm) Processor 6128 1500.105 MHz (physikalische CPU, nicht die nutzbaren Kerne)

    (31.10.2013)
    real 0m1.278s
    user 0m0.969s
    sys 0m0.006s

    (02.12.2012)
    real    0m1.476s
    user    0m1.224s
    sys     0m0.023s

    V-PowerServer S (v5.1)
    7,90 €/Monat
    25GB HDD
    2048 MB RAM (physikalisch)
    1 x Quad-Core AMD Opteron(tm) Processor 2347 HE 1431.598 MHz (physikalische CPU, nicht die nutzbaren Kerne)

    (31.10.2013)
    real 0m1.267s
    user 0m0.958s
    sys 0m0.008s

    (01.12.2012)
    real 0m1.674s
    user 0m1.324s
    sys 0m0.008s

    STRATO V-PowerServer S (v4.1)
    9,90 €/Monat
    (20.02.2010)
    real 0m1.793s
    user 0m1.405s
    sys 0m0.035s

    (09.05.2011)
    real 0m1.371s
    user 0m1.090s
    sys 0m0.006s

    STRATO V-PowerServer L (v4.3)
    29,90 €/Monat
    50GB HDD
    4096 MB RAM (physikalisch)
    2 x Quad-Core AMD Opteron(tm) Processor 2347 HE 1670.198 MHz (physikalische CPU, nicht die nutzbaren Kerne)

    (31.10.2013)
    real 0m0.953s
    user 0m0.942s
    sys 0m0.002s

    (01.12.2012)
    real 0m0.950s
    user 0m0.940s
    sys 0m0.005s

    (09.05.2011)
    real 0m0.987s
    user 0m0.978s
    sys 0m0.008s

    (20.02.2010)
    real 0m0.680s
    user 0m0.674s
    sys 0m0.007s

    STRATO V-PowerServer L (v5.3)
    24,90 €/Monat

    (09.05.2011)
    real 0m1.074s
    user 0m1.067s
    sys 0m0.008s

    STRATO V-PowerServer A (v2.5)
    (20.02.2010)
    real    0m0.875s
    user    0m0.866s
    sys     0m0.007s

    STRATO PowerServer MR (v4.3)  (Hardware)

    (20.02.2010)
    real    0m1.695s
    user    0m1.688s
    sys     0m0.008s

    ThinClient mit Via 800 Mhz CPU

    (20.02.2010)
    real    0m9.423s
    user    0m6.800s
    sys     0m0.020s

    Raspberry Pi

    (10.02.2013)
    real    0m4.566s
    user   0m3.730s
    sys     0m0.020s

    PC mit Intel Core 2 CPU 1600 Mhz CPU

    (02.12.2012)
    real    0m0.600s
    user    0m0.596s
    sys     0m0.004s

    Dell Poweredge 2950  (Hardware)
    Dual-Quad Core Intel(R) Xeon(R) CPU E5430 @ 2.66GHz  cpu MHz : 2660.011

    (29.12.2014)
    real 0m0.489s
    user 0m0.488s
    sys 0m0.000s

    Intel Atom  (Hardware)
    Quad Core Intel(R) Atom(TM) CPU D525 @ 1.80GHz cpu MHz : 1800.150

    (29.10.2015)
    real 0m1.759s
    user 0m1.752s
    sys 0m0.004s

    Strato Server Cloud VM
    1CPU 1GB Ram 20GB HDD
    Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz cpu MHz : 2300.050

    (29.10.2015)
    real 0m0.666s
    user 0m0.652s
    sys 0m0.008s

    Wie in der Überschrift erwähnt, ist dies nur ein Minimal CPU Benchmark. Er liefert nur als Momentaufnahme grobe Anhaltspunkte über die Geschwindigkeit der CPU (eines CPU Cores) und ersetzt keineswegs einen vollständigen Benchmark, der alle Systemkomponenten einbezieht.

  • Kombination der Linux/Unix Befehle find und ls mit xargs

    Ich wollte die Dateigröße aller Logdateien verschiedener vhosts eines Webservers anschauen. Mit

    find /srv/ -name access_log.log

    konnte ich mir die Logdateien anzeigen lassen. Nähere Informationen zu den Dateien inklusive Dateigröße erhoffte ich mir von folgendem Befehl:

    /srv/ -name access_log.log | ls-alh

    Die Pipe funktionierte leider nicht so, wie ich es erwartete. Ich bekam nur die Liste der Dateien im aktuellen Ordner. Eine Internetrecherche brachte dann die richtige Befehlskombination:

    find /srv/ -name access_log.log| xargs ls -lah