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

Aus Hergipedia
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „Bash: Performance Tricks {{:Bash: Performance Tricks}} ===Regel=== Der Aufruf des externe Kommandos '''grep''' kann oft durch den regexp Vergleisoperator '''=…“)
 
KKeine Bearbeitungszusammenfassung
 
(5 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 11: Zeile 11:
| align="center" style="background:#f0f0f0;"|''' Linux'''
| align="center" style="background:#f0f0f0;"|''' Linux'''
|-
|-
| vorher ||x.x s ||0.078 s
| vorher ||13.429 s ||0.078 s
|-
|-
| nachher ||x.x s ||0.037 s  
| nachher ||5.376 s ||0.037 s  
|}
|}


(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===
<source lang=bash>
<source lang=bash>
Zeile 28: Zeile 30:
   echo "Datei." >> $i.txt
   echo "Datei." >> $i.txt
done
done
newline="
"


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

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"
)