Bash-Tricks: grep Ersetzen durch =~: Unterschied zwischen den Versionen

Aus Hergipedia
Zur Navigation springen Zur Suche springen
KKeine Bearbeitungszusammenfassung
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:
{{:Bash: Performance Tricks}}
{{:Bash: Performance Tricks}}
===Regel===
===Regel===
Der Aufruf des externe Kommandos '''grep''' kann oft durch den regexp Vergleisoperator '''=~''' der bash ersetzt werden.
Der Aufruf des externe Kommandos '''grep''' kann oft durch den regexp Vergleichsoperator '''=~''' der bash ersetzt werden.


Als Beispiel sollen 20 Dateien nach dem Vorkommen der Zahl 15 durchsucht werden.
Als Beispiel sollen 20 Dateien nach dem Vorkommen der Zahl 5 durchsucht werden.


{| {{table}}
{| {{table}}
Zeile 16: Zeile 16:
|}
|}


(Die meiste Zeit verbringen die Tests jetzt beim Aufruf des externen Kommandos ''cat'').
Die meiste Zeit verbringen die Tests jetzt beim Aufruf des externen Kommandos '''cat'''. Das kann weiter verbessert werden,
siehe der [[Bash-Tricks: cat Ersetzen durch Umleitungsoperator|nächste Trick]].


===Demonstration===
===Demonstration===

Aktuelle Version vom 13. Januar 2010, 13:42 Uhr

Bash: Performance Tricks

  1. Zusammenfassen von externen Kommandos: for i in *; ls $i; done
  2. grep Ersetzen durch =~ : ... | grep abc.txt
  3. cat Ersetzen durch < : cat abc.txt

Regel

Der Aufruf des externe Kommandos grep kann oft durch den regexp Vergleichsoperator =~ der bash ersetzt werden.

Als Beispiel sollen 20 Dateien nach dem Vorkommen der Zahl 5 durchsucht werden.

Cygwin Linux
vorher 13.429 s 0.078 s
nachher 5.376 s 0.037 s

Die meiste Zeit verbringen die Tests jetzt beim Aufruf des externen Kommandos cat. Das kann weiter verbessert werden, siehe der nächste Trick.

Demonstration

mkdir bash-performance-tricks
cd bash-performance-tricks
for ((i=0; i<20; ++i )); do 
  echo "Hallo" > $i.txt
  echo "Welt." >> $i.txt
  echo "Dies" >> $i.txt
  echo "ist die $i." >> $i.txt
  echo "Datei." >> $i.txt
done

newline="
"

echo "======== mit grep ==========="
treffer=""
time ( for i in *.txt; do 
  if [ ! -z "`cat $i | grep -l 5`" ]; then treffer+="$i$newline"; fi
done
echo "grep: Folgende Dateien enthalten die Zahl 5:
$treffer"
)

echo "======== mit =~ ============="
treffer=""
time ( for i in *.txt; do 
  datei_inhalt=`cat $i`
  regex='5'
  if [[ $datei_inhalt =~ $regex ]]; then treffer+="$i$newline"; fi
done
echo "=~: Folgende Dateien enthalten die Zahl 5:
$treffer"
)