| 
			   | 
			
| (16 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | 
| Zeile 1: | 
Zeile 1: | 
| − | ==(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.==
  | + | [[Category:Programmierung]]  | 
| − | sed -e '/regex/command' eingabedatei > ausgabedatei<br /><br />
  | + |  | 
| − | Bsp.: Alle Zeilen Löschen, in denen "ABC" am Anfang der Zeile steht.:
  | + |  | 
| − |  sed -e '/^ABC/d' eingabedatei.txt > ausgabedatei.txt
  | + |  | 
| − | ''Vorsicht:'' ist die Eingabedatei gleich der Ausgabedatei, dann wird die Ausgabedatei am Ende leer sein. :-(
  | + |  | 
|   |  |   |  | 
| − | ==Bash Bashing==
  | + | Zum Thema '''BASH''' finden sich folgende Artikel:  | 
| − |    | + | * [[(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.]]  | 
| − | Unlesbare Bash-Skripte, unnötige externe Programmaufrufe und überlange Befehlsketten sind vermeidbar.
  | + | * [[Bash Bashing]]  | 
| − | Interessante Beiträge aus der gleichnamigen Beitragsserie des Linux-Magazins und weitere Anregungen folgen hier in Kurzform.
  | + | * [[dump-Backupskript]]  | 
| − |    | + | * [[Datei einer bestimmten Größe mit zufälligem Inhalt erstellen]]  | 
| − | ===cut, sed, grep & Co. vermeiden===
  | + | * [[Zufälligen String mit einer definierten Länge erzeugen]]  | 
| − |    | + |  | 
| − | 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==
  | + |  | 
| − |    | + |  | 
| − |  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
  | + |  | 
| − |    | + |  | 
| − | ==dump-Backupskript==
  | + |  | 
| − |    | + |  | 
| − | Enthält ein paar interessante Hacks.
  | + |  | 
| − |    | + |  | 
| − |  #!/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
  | + |  | 
| − |    | + |  | 
| − | == Datei einer bestimmten Größe mit zufälligem Inhalt erstellen==
  | + |  | 
| − | Brauchbar z.B. für Bandbreitentests.
  | + |  | 
| − |  dd if=/dev/urandom bs=1M count=4096 of=4gb_testdatei
  | + |  | 
| − | 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.
  | + |  | 
| − |  
  | + |  | 
| − |  #!/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
  | + |  |