Archiv der Kategorie: Stringbearbeitung

awk

. Bawk Ausdruck { Anweisungen } Datei

Ausdruck

Der erste Parameter ist ein regulärer Ausdruck.

Anweisungen

Den zweiten Parameter stellen die awk-Anweisungen (anzugeben in geschweiften Klammern) dar. Diese Anweisungen legen fest, welche Manipulationen am Input-Stream durchgeführt werden sollen.

Datei

Der Parameter Datei legt die Datei fest, aus der der Input-Stream gelesen werden soll. Ohne Angabe liest awk von der Standardeingabe oder aus einer Pipe.

Beispiele

Beispiel 1: 2. Spalte ausgeben (z. B. Prozess-ID bei grep)

ps aux | grep suchstring | awk '{print $2}'

Beispiel 2: alle Zeilen einer Datei mit dem Buchstaben „n“ ausgeben:

awk '/n/' /etc/group

read

Liest eine Zeichenkette von der Standardeingabe ein.
-n Anzahl der einzulesenden Zeichen
-s x Wartet maximal x Sekunden auf die Eingabe
-p Text gibt „Text“ vor dem Einlesen auf der Standardausgabe aus

read -n 1 -s 5 eingabe
 if [ $? -eq 1 ] ; then
 echo "Zeitüberschreitung für die Eingabe ..."
 fi
echo $eingabe

Dateinamen, Dateiendung und Pfad trennen

  • Pfad ohne letzten Slash:  DIR="${i%/*}"
    alternativ:  DIR=`dirname "$i"`
  • Pfad mit Dateinamen ohne Endung:  xBASE="${i%.*}"
    alternativ:  xBASE=`echo "$i" | sed 's/\(.*\)\..*/\1/'`
  • Aktuellen Pfad durch . ersetzen:  [ "$DIR" == "$i" ] && DIR=.
  • Dateiname mit Endung: FILE="${i##*/}"
    alternativ: FILE=`basename "$i"`
  • Dateiendung: FILEEXT=${i##*.}
    alternativ:  FILEEXT=`echo "$i" | sed 's/.*\.\(.*\)/\1/'`
    Dateiendung in Großbuchstaben:  FILEEXT=`echo ${i##*.} | tr '[:lower:]' '[:upper:]'
  • Dateiname ohne Endung: FILEBASE=${FILE%.*}

Stringbearbeitung (Variablen)

Aufruf Beschreibung
${name:n:m} liefert Teil eines Strings
n = Offset, negativ = vom Ende her (in diesem Fall muss ein Leerzeichen vor dem Minus stehen!)
m = Anzahl (kann entfallen)
${name#a} entfernt den Anfang, wenn dieser mit a übereinstimmt
a = Suchstring (Windcards (?,*) sind erlaubt)
${name##*a} entfernt alle Übereinstimmungen mit a vom Anfang her
a = Suchstring (Windcard „*“ notwendig!)
${name%a} entfernt das Ende, wenn dieses mit a übereinstimmt
a = Suchstring (Windcards (?,*) sind erlaubt)
${name%%a*} entfernt alle Übereinstimmungen mit a vom Ende her
a = Suchstring (Windcard „*“ notwendig!)
${name/s/e} Suchen / Ersetzen (erste Fundstelle)
s = Suchstring (Windcards (?,*) sind erlaubt)
e = Ersatzstring (kann entfallen -> Suchstring wird entfernt)
${name//s/e} Suchen / Ersetzen (alle Fundstellen)
s = Suchstring (Windcards (?,*) sind erlaubt)
e = Ersatzstring (kann entfallen -> Suchstring wird entfernt)
${name:-a} Standardwert zurückgeben
gibt den Wert „a“ zurück, wenn die Variable „name“ leer ist
${name:=a} Standardwert setzen und zurückgeben
gibt den Wert „a“ zurück und weist diesen der Variablen „name“ zu, wenn die Variable „name“ leer ist
${name:?a} Fehlermeldung und Programmabbruch
Wenn die Variable „name“ leer ist, wird die Fehlermeldung „a“ ausgegeben und das Skript beendet.
${name:+a} liefert „a“, wenn „name“ nicht leer ist
mit dieser Funktion kann z.B. ein „/“ eingefügt werden, wenn eine Datei übergeben wird (z.B. $HOME${datei:+/}$datei )

tr

Zeichen in Dateien ersetzen

Option Bedeutung
-d Entfernt die Zeichen in Satz1 aus der Zeichenfolge
-s Entfernt mehrfache Vorkommen der Zeichen in Satz1
-c Ersetzt die Zeichen, die nicht in Satz1 vorkommen

Beispiele:
cat file1 | tr altes_Wort neues_Wort > NeueDatei

tr -d ':' < /etc/passwd 
liest /etc/passwd und entfernt aus diesem Zeichenstrom alle Doppelpunkte.

tr -s '\n' 
ersetzt doppelte oder mehrfache Leerzeilen durch eine einzige.

tr "\n" " " < dateiname > neue_datei 
löscht alle Zeilenumbrüche

tr [:lower:] [:upper:]
ersetzt alle Kleinbuchstaben aus der Standardeingabe durch Großbuchstaben und gibt das Ergebnis auf der Standardausgabe aus.

sed

sed verwendet reguläre Ausdrücke

Suchen und ersetzen von Text in Dateien: sed 's/Suchtext/Ersetztext/g' quelldatei.txt > zieldatei.txt Ist im zu bearbeitenden Text ein Slash / , so muss dieser mit  \/  angegeben werden.
Leerzeichen in Dateinamen in Unterstriche umwandeln: for a in *; do mv "$a" "$(echo $a | sed 's/ /_/g')"; done