Zeichenketten bearbeiten

Aus Mediawiki Ferdinand Gruber
Zur Navigation springen Zur Suche springen

Stringverarbeitung mit der Bash

  • Zeichen am Anfang abschneiden
file="DateiName.txt"
echo ${file:5}

Ausgabe

Name.txt
  • 4 Zeichen ab Position 5 herausschneiden
file="DateiName.txt"
echo ${file:5:4}

Ausgabe

Name

cut

Aus einer Zeichenkette Zeichen herausschneiden

Beispiele:

# GID aus /etc/passwd anzeigen
zeile=`grep username /etc/passwd` 
gid=`echo $zeile | cut -d ":" -f "4"`
# Benutzerliste aus LDAP extrahieren:
ldapsearch -x -b "ou=users,dc=network" uid -LLL | grep uid: | cut -d " " -f "2"
 
# Homedirectories anzeigen:
ldapsearch -x -b "ou=users,dc=network" homeDirectory -LLL | grep homeDirectory: | cut -d " " -f "2"

-d gibt das Trennzeichen an

Das Standardtrennzeichen ist das Tabulatorzeichen

-f gibt an, das wievielte Feld herauszuschneiden ist.

du

Ermittelt den Speicherplatz von Dateien (Ordnern).

  • Absteigen um eine Ebene
du -h -d 1
du -h --max-depth=1
# -h Größe in lesbarem Format ausgeben
  • Nur Summe angeben
du -sh
du --summarize -h
  • Kleine Ordner überspringen
du -h -t 500M
du -h --threshold=500M
  • Ausgabe sortieren
du -hs | sort -n

here-document

Zur Ausgabe eines mehrzeiligen Textes in einem Skript

if [ $# -eq 0 ]; then
  cat << 'delimiter'
  -----------------------------------------------------
  Usage: adduser.sh User Gruppe Zuname Vorname Passwort
  oder
     adduser.sh Dateiname
  -----------------------------------------------------
delimiter
  exit
fi


sed

Suchen und Ersetzen von Text

# Jedes Vorkommen des Suchtextes ersetzen
cat datei.txt | sed -e s/'suchtext'/'ersatztext'/g > neue_datei.txt

# Nur das erste Vorkommen des Suchbegriffs pro Zeile ersetzen
cat datei.txt | sed -e s/'suchtext'/'ersatztext'/ > neue_datei.txt
# Nur das 3. Vorkommen des Suchbegriffs pro Zeile ersetzen und das Ergebnis ausgeben
cat datei.txt | sed -e s/'suchtext'/'ersatztext'/3p > neue_datei.txt
  • Kommentare und Leerzeilen entfernen
sed -e '/^\#/d' datei > datei.tmp
sed -e '/^$/d' datei.tmp > datei
  • Anführungszeichen löschen
echo "text" | sed 's/"//g'
  • Rekursiv suchen und ersetzen von Text
if [ $# -gt 2 ] ; then
   suchtext=$1
   ersatztext=$2
else
   read -e -p "Suchtext: " suchtext
   read -e -p "ersetzen durch: " ersatztext
fi 

grep -rl "$suchtext" | \
while read file; do
   cp "$file" datei.tmp
   sed -e s/"$suchtext"/"$ersatztext"/g datei.tmp > "$file"
done
rm datei.tmp
  • Ersetzen von Variablen etc. in PHP Dateien
suchtext=\$this-\>someThing
ersatztext=\$this-\>someNewThing
grep -rl --include  "*.php" "$suchtext" | \
while read file; do
   cp "$file" datei.tmp
   sed -e s/"$suchtext"/"$ersatztext"/g datei.tmp > "$file"
done
rm datei.tmp

Man beachte das Quoten der Zeichen $ und >

Dateinamen ändern

suchtext="IMG_ "
ersatztext="Bild_"
for file in * ; do neu=`echo $file | sed s/"$suchtext"/"$ersatztext"/`;mv "$file" "$neu"; done
  • Verzeichnisnamen rekursiv ändern
read -e -p "Suchtext: " suchText
read -e -p "ersetzen durch: " ersatzText
find . -type d | \
while read dir; do
   newDir=`echo "$dir" | sed -e s/"$suchText"/"$ersatzText"/`; 
   if [ $dir != $newDir ] ; then mv "$dir" "$newDir" ; fi
done

sort

  • Passwortdatei sortieren nach UID
sort -t: -k 3n /etc/passwd
Doppelpunkt als Trennzeichen für Spalten: Option -t
Sortieren numerisch nach der 3. Spalte

Verbrauchten Festplattenplatz ausgeben und Liste sortieren:

# Es wird numerisch nach der 3. Spalte sortiert (0, 1, 2)

repquota -a | sort -n +2

ergibt:

hs        --   654052       0       0           8068     0     0
eifr      --   710531       0       0           4710     0     0
vs        --  1721870       0       0           5303     0     0
vsdir     --  2077308       0       0           5795     0     0
root      -- 10953439       0       0           3767     0     0

tr

  • Dateinamen ändern mit tr

Zum Beispiel Großbuchstaben in Kleinbuchstaben

for file in *
   do
   new=`echo $file | tr '[:upper:]' '[:lower:]'`
   # new=`echo $file | tr '11.3' '11.4'` 
   echo mv $file $new
done

Mit find auch rekursiv

find . -type f | while read i; do
   file="${i##*/}";
   directory="${i%/*}";
   mv "$i" "$directory"/"`echo "$file" | tr "A-Z" "a-z"`" ;
done