|
|
(8 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) |
Zeile 1: |
Zeile 1: |
| [[Category:Programmierung]] | | [[Category:Programmierung]] |
| | | |
− | ==[[(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.]]==
| + | Zum Thema '''BASH''' finden sich folgende Artikel: |
− | sed -e '/regex/command' eingabedatei > ausgabedatei<br /><br />
| + | * [[(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.]] |
− | Bsp.: Alle Zeilen Löschen, in denen "ABC" am Anfang der Zeile steht.:
| + | * [[Bash Bashing]] |
− | sed -e '/^ABC/d' eingabedatei.txt > ausgabedatei.txt
| + | * [[dump-Backupskript]] |
− | ''Vorsicht:'' ist die Eingabedatei gleich der Ausgabedatei, dann wird die Ausgabedatei am Ende leer sein. :-(
| + | * [[Datei einer bestimmten Größe mit zufälligem Inhalt erstellen]] |
− | | + | * [[Zufälligen String mit einer definierten Länge erzeugen]] |
− | ==Bash Bashing==
| + | |
− | | + | |
− | Unlesbare Bash-Skripte, unnötige externe Programmaufrufe und überlange Befehlsketten sind vermeidbar.
| + | |
− | Interessante Beiträge aus der gleichnamigen Beitragsserie des Linux-Magazins und weitere Anregungen folgen hier in Kurzform.
| + | |
− | | + | |
− | ===cut, sed, grep & Co. vermeiden===
| + | |
− | | + | |
− | Quelle: Folge 5, Linux-Magazin 02/10
| + | |
− | | + | |
− | ====Parameter-Expansion====
| + | |
− | | + | |
− | Nach dem Schema ${<Variable><Zeichen><Suchmuster>} erledigt die Bash viele Aufgaben selbst, die sonst mit cut, sed, grep oder awk gelöst werden.
| + | |
− | Als Zeichen # % / ^ , zulässig, die doppelte Angabe schaltet jeweils in den gierigen Modus und ersetzt alles bis zum letzten Vorkommen des Suchmusters.
| + | |
− | | + | |
− | {|border="1"
| + | |
− | ! Zeichen
| + | |
− | ! Bedeutung
| + | |
− | ! Beispiel
| + | |
− | |-
| + | |
− | | #
| + | |
− | | Löschen von links
| + | |
− | | X="aabcabcc"; ${X#a}; löscht das erste a
| + | |
− | |-
| + | |
− | | ##
| + | |
− | | Löschen von links
| + | |
− | | X="aabcabcc"; ${X##a}; löscht alle führenden a (funktioniert in Bash 3.2 nicht, wo ist der Fehler?)
| + | |
− | |-
| + | |
− | | %
| + | |
− | | Löschen von rechts
| + | |
− | | X="aabcabcc"; ${X%c}; löscht das letzte c
| + | |
− | |-
| + | |
− | | %%
| + | |
− | | Löschen von rechts
| + | |
− | | X="aabcabcc"; ${X%c}; löscht alle c am Ende (funktioniert in Bash 3.2 nicht, wo ist der Fehler?)
| + | |
− | |-
| + | |
− | | /
| + | |
− | | Ersetzen (substitude)
| + | |
− | | X="aabcabcc"; ${X/b/d}; ersetzt 1. b durch d
| + | |
− | |-
| + | |
− | | /
| + | |
− | | Ersetzen (substitude)
| + | |
− | | X="aabcabcc"; ${X/b}; löscht 1. b
| + | |
− | |-
| + | |
− | | //
| + | |
− | | Ersetzen (substitude)
| + | |
− | | X="aabcabcc"; ${X//b/d}; ersetzt alle b durch d
| + | |
− | |-
| + | |
− | | //
| + | |
− | | Ersetzen (substitude)
| + | |
− | | X="aabcabcc"; ${X//b}; löscht alle b
| + | |
− | |-
| + | |
− | !
| + | |
− | ! funktioniert erst ab Bash 4
| + | |
− | !
| + | |
− | |-
| + | |
− | | ^
| + | |
− | | Umwandeln in Großbuchstaben (uppercase)
| + | |
− | | X="aabcabcc"; ${X^a}; wandelt erstes a in A
| + | |
− | |-
| + | |
− | | ^^
| + | |
− | | Umwandeln in Großbuchstaben (uppercase)
| + | |
− | | X="aabcabcc"; ${X^^bc}; wandelt alle bc in BC
| + | |
− | |-
| + | |
− | | ^^
| + | |
− | | Umwandeln in Großbuchstaben (uppercase)
| + | |
− | | X="aabcabcc"; ${X^^}; wandelt alles in Grossbuchstaben
| + | |
− | |-
| + | |
− | | ,
| + | |
− | | Umwandeln in Kleinbuchstaben (lowercase)
| + | |
− | | X="AABCABCC"; ${X,A}; wandelt erstes A in a
| + | |
− | |-
| + | |
− | | ,,
| + | |
− | | Umwandeln in Kleinbuchstaben (lowercase)
| + | |
− | | X="AABCABCC"; ${X,,BC}; wandelt alle BC in bc
| + | |
− | |-
| + | |
− | | ,,
| + | |
− | | Umwandeln in Kleinbuchstaben (lowercase)
| + | |
− | | X="AABCABCC"; ${X,,}; wandelt alles in Kleinbuchstaben
| + | |
− | |}
| + | |
− | | + | |
− | praktische Beispiele:
| + | |
− | VERZEICHNIS="${0%/*}"
| + | |
− | löscht alles bis zum ersten / von rechts
| + | |
− | ersetzt:
| + | |
− | VERZEICHNIS=$(dirname "$0")
| + | |
− |
| + | |
− | SKRIPTNAME="${0##*/}"
| + | |
− | löscht alles bis zum letzten / von links
| + | |
− | ersetzt:
| + | |
− | SKRIPTNAME=$(basename "$0")
| + | |
− | | + | |
− | ==IP-Validierung==
| + | |
− | <source lang="bash">
| + | |
− | function valid_ip()
| + | |
− | {
| + | |
− | local ip=$1
| + | |
− | local stat=1
| + | |
− |
| + | |
− | # bash 2:
| + | |
− | # if ( echo $ip | egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' > /dev/null ) ; then
| + | |
− | # bash 3:
| + | |
− | if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
| + | |
− | OIFS=$IFS
| + | |
− | IFS='.'
| + | |
− | ip=($ip)
| + | |
− | IFS=$OIFS
| + | |
− | [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
| + | |
− | stat=$?
| + | |
− | fi
| + | |
− | return $stat
| + | |
− | }
| + | |
− |
| + | |
− | if valid_ip $IP; then
| + | |
− | echo "IP ist eine IPv4-Adresse"
| + | |
− | fi
| + | |
− | </source>
| + | |
− | | + | |
− | ==dump-Backupskript==
| + | |
− | | + | |
− | Enthält ein paar interessante Hacks.
| + | |
− | <source lang="bash">
| + | |
− | #!/bin/bash
| + | |
− | # Funktionen
| + | |
− | function backup_age() {
| + | |
− | LEVEL=$1
| + | |
− | if ! test -f /tmp/backups/home/$LEVEL; then
| + | |
− | return 1
| + | |
− | fi
| + | |
− | LAST_DUMP=$(file /tmp/backups/home/$LEVEL \
| + | |
− | | grep -o "... ... .. ..:..:.. ...." | head -1)
| + | |
− | LAST_DUMP_EPOCH=$(date +%s -d "$LAST_DUMP")
| + | |
− | NOW_EPOCH=$(date +%s)
| + | |
− | echo $((NOW_EPOCH - LAST_DUMP_EPOCH))
| + | |
− | }
| + | |
− | function cleanup() {
| + | |
− | LEVEL=$1
| + | |
− | rm -f /tmp/backups/home/*.tmp
| + | |
− | for file in /tmp/backups/home/*
| + | |
− | do
| + | |
− | base=$(basename $file)
| + | |
− | test "$base" = "*" && break
| + | |
− | test "$base" -le $LEVEL && continue
| + | |
− | rm $file
| + | |
− | done
| + | |
− | }
| + | |
− |
| + | |
− | # Programm
| + | |
− | if ! test $(id -u) = 0; then
| + | |
− | echo "$0: Keine Root-Rechte!" >&2
| + | |
− | exit 1
| + | |
− | fi
| + | |
− | if ! backup_age 0 \
| + | |
− | || test $(backup_age 0) -gt 604800; then
| + | |
− | dump -u -0 -f /tmp/backups/home/0.tmp /home \
| + | |
− | && mv /tmp/backups/home/0{.tmp,}
| + | |
− | cleanup 0
| + | |
− | elif ! backup_age 1 \
| + | |
− | || test $(backup_age 1) -gt 86400; then
| + | |
− | dump -u -1 -f /tmp/backups/home/1.tmp /home \
| + | |
− | && mv /tmp/backups/home/1{.tmp,}
| + | |
− | cleanup 1
| + | |
− | else
| + | |
− | dump -u -2 -f /tmp/backups/home/2.tmp /home \
| + | |
− | && mv /tmp/backups/home/2{.tmp,}
| + | |
− | cleanup 2
| + | |
− | fi
| + | |
− | </source>
| + | |
− | | + | |
− | == Datei einer bestimmten Größe mit zufälligem Inhalt erstellen==
| + | |
− | Brauchbar z.B. für Bandbreitentests.
| + | |
− | <source lang="bash">
| + | |
− | dd if=/dev/urandom bs=1M count=4096 of=4gb_testdatei
| + | |
− | </source>
| + | |
− | In diesem Beispiel wird eine 4GB große Datei erstellt.
| + | |
− | | + | |
− | == Zufälligen String mit einer definierten Länge erzeugen ==
| + | |
− | * Kann z.B. zum erzeugen eines neuen Passwortes genutzt werden.
| + | |
− | * Das Bsp.-script prüft:
| + | |
− | ** ob ein Parameter für die Länge des zu erzeugenden Strings übergeben wird,
| + | |
− | ** ob dieser ein Integer ist
| + | |
− | ** und dieser kleiner als 1000000 ist (dient gegen Rechnerstress).
| + | |
− | * Die Standardlänge des Strings ist hier 10 Zeichen.
| + | |
− | <source lang="bash">
| + | |
− | #!/bin/bash
| + | |
− |
| + | |
− | #
| + | |
− | # function for random string
| + | |
− | #
| + | |
− | function randstrg () {
| + | |
− | local strgLength
| + | |
− | local strg
| + | |
− | if [ $1 ]; then
| + | |
− | strgLength=$1
| + | |
− | else
| + | |
− | strgLength=10
| + | |
− | fi
| + | |
− |
| + | |
− | strg=</dev/urandom tr -dc A-Za-z0-9 | head -c $strgLength
| + | |
− | return $strg
| + | |
− | }
| + | |
− |
| + | |
− | #
| + | |
− | # ERROR-handling if parameter 1 set, not to big and not a integer
| + | |
− | #
| + | |
− | if [ ${1} ]; then
| + | |
− | if [ ! $(echo "${1}" | grep -E "^[0-9]+$") ] || [ "${1}" -gt 1000000 ]; then
| + | |
− | echo 'wrong 1. parameter ( Must be an INTEGER <= 1000000! )'
| + | |
− | echo 'usage:'
| + | |
− | echo "${0} [ INTEGER ]"
| + | |
− | exit
| + | |
− | fi
| + | |
− | fi
| + | |
− |
| + | |
− | #
| + | |
− | # GO
| + | |
− | #
| + | |
− | strg= randstrg ${1}
| + | |
− | echo $strg
| + | |
− | </source>
| + | |