Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
fortgeschrittene:skripte [2011/11/14 17:48] ingo_wichmann [Suchen und Ersetzen mit bash] |
— (aktuell) | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== for-Schleife ====== | ||
- | <code bash> | ||
- | for RECHNER in 22 04 05 | ||
- | do | ||
- | ssh nutzer$RECHNER@notebook$RECHNER play /usr/share/sounds/phone.wav | ||
- | done | ||
- | </code> | ||
- | Alle Rechner von 201 bis 230 anpingen: | ||
- | <code bash> | ||
- | for IP in {201..230} | ||
- | do | ||
- | ping -c 1 192.168.1.$IP | ||
- | done | ||
- | </code> | ||
- | |||
- | Umbenennen von allen Dateien, die auf .txt enden nach .bak: | ||
- | <code bash> | ||
- | shopt -s nullglob | ||
- | for DATEI in *.txt | ||
- | do | ||
- | mv $DATEI ${DATEI%.txt}.bak | ||
- | done | ||
- | </code> | ||
- | |||
- | ====== while ====== | ||
- | Netzwerk EKG | ||
- | ping 192.168.1.7 | while read; do play /usr/share/sounds/info.wav; done | ||
- | |||
- | ====== until ====== | ||
- | warten bis Tunnel aufgebaut ist | ||
- | ssh -i /root/.ssh/backup-id_dsa backup@server -n -N -L 873:localhost:873 & | ||
- | SSHPID=$! | ||
- | echo wait for connection to localhost:873 | ||
- | until lsof -i4TCP:873; do echo -n .; sleep 1; done | ||
- | echo | ||
- | echo got connection | ||
- | tunnel nutzen ... und dann wieder schließen | ||
- | kill $SSHPID | ||
- | |||
- | ====== case in Init-Skripten ====== | ||
- | Vereinfachtes Beispiel für ein init-Skript: | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | case "$1" in | ||
- | start) | ||
- | date | ||
- | ;; | ||
- | stop) | ||
- | date | ||
- | ;; | ||
- | restart) | ||
- | $0 stop | ||
- | $0 start | ||
- | ;; | ||
- | *) | ||
- | echo usage $0 [start] [stop] [restart] | ||
- | ;; | ||
- | esac | ||
- | </code> | ||
- | |||
- | ====== here-Dokument für Templates ====== | ||
- | Here Dokumente als Templates ((Das - vor dem Begrenzungstext sorgt dafür, daß Tabulator-Zeichen am Zeilenanfang ignoriert wird. Damit bekommt man schönere Formatierung hin)): | ||
- | <file> | ||
- | VARIABLE=test | ||
- | cat <<-HTML; | ||
- | <html> | ||
- | <head> | ||
- | <title>Variable ist $VARIABLE</title> | ||
- | </head> | ||
- | <body> | ||
- | bla | ||
- | </body> | ||
- | </html> | ||
- | HTML | ||
- | </file> | ||
- | |||
- | Hier das selbe ohne Variablenersetzung/Kommandosubstitution: | ||
- | <file> | ||
- | VARIABLE=test | ||
- | cat <<-'HTML'; | ||
- | <html> | ||
- | <head> | ||
- | <title>Variable ist $VARIABLE</title> | ||
- | </head> | ||
- | <body> | ||
- | bla | ||
- | </body> | ||
- | </html> | ||
- | HTML | ||
- | </file> | ||
- | |||
- | |||
- | ====== Suchen und Ersetzen mit sed ===== | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | |||
- | SUCHWORT="$1" | ||
- | ERSATZTEXT="$2" | ||
- | DATEI="$3" | ||
- | |||
- | TMPFILE=$(mktemp) | ||
- | sed "s/$SUCHWORT/$ERSATZTEXT/g" "$DATEI" > "$TMPFILE" | ||
- | cat "$TMPFILE" > "$DATEI" | ||
- | rm "$TMPFILE" | ||
- | </code> | ||
- | |||
- | oder einfacher | ||
- | |||
- | <code bash> | ||
- | #!/bin/bash | ||
- | |||
- | SUCHWORT="$1" | ||
- | ERSATZTEXT="$2" | ||
- | DATEI="$3" | ||
- | |||
- | sed -i "s/$SUCHWORT/$ERSATZTEXT/g" "$DATEI" | ||
- | </code> | ||
- | |||
- | ====== Suchen und Ersetzen mit bash ===== | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | |||
- | SUCHWORT="$1" | ||
- | ERSATZTEXT="$2" | ||
- | DATEI="$3" | ||
- | |||
- | TMPFILE=$(mktemp) | ||
- | ( while IFS='' read line | ||
- | do | ||
- | line="${line//$SUCHWORT/$ERSATZTEXT}" | ||
- | done ) < "$DATEI" > "$TMPFILE" | ||
- | cat "$TMPFILE" > "$DATEI" | ||
- | rm "$TMPFILE" | ||
- | </code> | ||
- | |||
- | |||
- | ====== Suchen und Ersetzen mit perl ===== | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | |||
- | SUCHWORT="$1" | ||
- | ERSATZTEXT="$2" | ||
- | DATEI="$3" | ||
- | |||
- | perl -pi -e "s/$SUCHWORT/$ERSATZTEXT/g" "$DATEI" | ||
- | </code> | ||
- | |||
- | ====== Suchen und Ersetzen mit ksh/bash ===== | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | |||
- | SUCHWORT="$1" | ||
- | ERSATZTEXT="$2" | ||
- | DATEI="$3" | ||
- | |||
- | TMPFILE=`mktemp` | ||
- | while read line | ||
- | do | ||
- | line=${line//${SUCHWORT}/${ERSATZTEXT}} | ||
- | echo "${LINE}" > $TMPFILE | ||
- | done < ${DATEI} | ||
- | mv $TMPFILE ${DATEI} | ||
- | </code> | ||
- | |||
- | ====== Gruppierung und sed ====== | ||
- | <code bash> | ||
- | sed -n 's/nutzer\([0-9]\+\)/\1nutzer/pg' /etc/passwd | ||
- | sed -n 's/^\([^:]\+:[^:]*:\)\([[:digit:]]\{4\}\):/\11\2:/p' /etc/passwd | ||
- | |||
- | # \1 \2 (uidNumber) | ||
- | sed -nr 's/^([^:]+:[^:]*:)([[:digit:]]{4}):/\11\2:/p' /etc/passwd | ||
- | </code> | ||
- | |||
- | ====== Gruppierung und perl ====== | ||
- | <code bash> | ||
- | perl -p -e ' | ||
- | s/ | ||
- | ( nutzer(\d+) ): # Benutzername \1, nutzer-nummer \2 | ||
- | ( [^:]* ): # Passwort \3 | ||
- | \d+: # UidNumber | ||
- | /\1:\3:5\2:/x # Ersatztext | ||
- | ' /etc/passwd | ||
- | </code> | ||
- | |||
- | ====== usage-Meldung mit Shell-function und or ====== | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | function usage() | ||
- | { | ||
- | echo $0 suchwort ersatztext datei | ||
- | exit 1 | ||
- | } | ||
- | |||
- | test $# -eq 3 || usage | ||
- | |||
- | </code> | ||
- | |||
- | |||
- | ====== Fehlersuche ====== | ||
- | ''set -x'' einschalten: Jede Zeile wird ausgegeben, bevor sie ausgeführt wird. | ||
- | |||
- | ''set -e'' einschalten: Programm bricht beim ersten Fehler ab | ||
- | |||
- | Fehlermeldungen für mehrere Befehle umleiten: | ||
- | <code bash> | ||
- | exec 4>&2 | ||
- | exec 2>/dev/null | ||
- | </code> | ||
- | .. Befehle .. | ||
- | <code bash> | ||
- | exec 2>&4 | ||
- | exec 4>&- | ||
- | </code> | ||
- | Fehlermeldungen wiederherstellen und Kanal 4 schließen | ||
- | |||
- | |||
- | ====== Dokumentation ====== | ||
- | * http://www.tldp.org/LDP/Bash-Beginners-Guide/html/index.html | ||
- | * http://www.tldp.org/LDP/abs/html/index.html | ||
- | * http://mywiki.wooledge.org/BashFAQ |