Kleines Suchscript

Status
Für weitere Antworten geschlossen.

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ich musste heute in einem Verzeichnis voller PHP Dateien nach denjenigen suchen, die einen bestimmten String enthalten. Direkt auf der Kommandokonsole hatte ich es nur hingekriegt, dass ich die Zeilen ausgegeben bekommen habe. Das war jedoch ohne Angabe über das File nicht wirklich zu gebrauchen.
Also habe ich mir folgendes Helferlein geschrieben, welches die Suche übernimmt. Vielleicht kanns jemand brauchen
Code:
#!/bin/sh
if [ "$1" = '-h' ] || [ "$1" = '--help' ] || [ $# -eq 0 ] ; then
 echo ""
 echo "Sucht rekursiv nach dem Vorkommen eines Strings in einer Datei"
 echo ""
 echo "Usage     : search nadel [heuhaufen]"
 echo "nadel     : String nach dem gesucht werden soll"
 echo "heuhaufen : fakultative Angabe des Suchpfades."
 echo "            Ohne heuhaufen wird im aktuellen Verzeichnis gesucht"
 exit
fi
if [ -z $1 ] ; then
 echo "Kein Suchstring angegeben"
 exit
fi

if [ -z $2 ] ; then
 pfad=$(pwd)
 echo "Starte Suche im aktuellen Verzeichnis ($pfad)"
else
 if [ -e $2 ] ; then
  pfad=$2
  echo "Starte Suche in $pfad"
 else
  echo "Pfad nicht gefunden ($2)"
  exit
 fi
fi
for i in $(find $pfad  -type f) ; do
 t=$(cat "$i" | grep "$1")
 if [ "$?" = 0 ] ; then
  echo "$i"
 fi
done
 

AXELB

Benutzer
Mitglied seit
13. Sep 2008
Beiträge
150
Punkte für Reaktionen
0
Punkte
0
Boa, wie oft ich sowas schon gesucht habe, danke dir. Werd es bestimmt wieder einmal benötigen.

lg Alex
 

thedude

Benutzer
Mitglied seit
30. Nov 2009
Beiträge
2.244
Punkte für Reaktionen
2
Punkte
84
Ich stehe ja voll auf den KISS (Keep It Simple Stupid) approach. :) Sollte zudem auch schneller laufen, weil nicht zichmal grep und cat gespawned werden.

Rich (BBCode):
grep -l suchwort *

Ggf. noch interessant: -L statt -l invertiert die Ausgabe, listet also alles Files die suchwort nicht enthalten. -i macht die Suche unabänging von gross/kleinschreibung.

gruss
dude
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Ich hatte mal vor langer Zeit ein Projekt dazu angefangen. http://www.synology-forum.de/showthread.html?t=2079. Aber so richtige Begeisterung wollte nicht aufkommen. Vermutlich hat es keinen interessiert. Jetzt ist diese Suche im AdminTool-Explorer drinne ...

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@thedude
Ganz schön kurz :D
Habe es mal in den Suchcode eingebaut und mit time gemessen. Dein Vorschlag hat nur ein Drittel der Laufzeit, verglichen mit meinem Highperformance Code ;)
Dein Code
Code:
time search listFileContents
Starte Suche nach "listFileContents" im aktuellen Verzeichnis (/volume1/web)
/volume1/web/include
svnlook.php template.php

real    0m 3.89s
user    0m 3.57s
sys     0m 0.32s
und mein "Renner"
Code:
time search listFileContents
Starte Suche nach "listFileContents" im aktuellen Verzeichnis (/volume1/web)
/volume1/web/include/template.php
/volume1/web/include/svnlook.php
real    0m 11.46s
user    0m 4.81s
sys     0m 6.63s
Also hoffe ich dass du nix dagegen hast wenn ich deinen Code ratze und selber verwende :)
Code:
#!/bin/sh
if [ "$1" = '-h' ] || [ "$1" = '--help' ] || [ $# -eq 0 ] ; then
 echo ""
 echo "Sucht rekursiv nach dem Vorkommen eines Strings in einer Datei"
 echo ""
 echo "Usage     : search nadel [heuhaufen]"
 echo "nadel     : String nach dem gesucht werden soll"
 echo "heuhaufen : fakultative Angabe des Suchpfades."
 echo "            Ohne heuhaufen wird im aktuellen Verzeichnis gesucht"
 exit
fi
if [ -z $1 ] ; then
 echo "Kein Suchstring angegeben"
 exit
fi

if [ -z $2 ] ; then
 pfad=$(pwd)
 echo "Starte Suche nach \"$1\" im aktuellen Verzeichnis ($pfad)"
else
 if [ -e $2 ] ; then
  pfad=$2
  echo "Starte Suche nach \"$1\" in $pfad"
 else
  echo "Pfad nicht gefunden ($2)"
  exit
 fi
fi
for i in $(find $pfad  -type d) ; do
 cd $i
 t=$(grep -l "$1" *)
 if [ $? -eq 0 ] ; then
  echo $i
  echo $t
  echo ""
 fi
done
Gruss

tobi
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Hmm, ganz schön viel Stoff da ... wenn du den IPKG grep nehmen könntest, wäre das schlichter:

Rich (BBCode):
/opt/bin/grep -Rn "listFileContents" /volume1/web

Rennt durch die Verzeichnisse (rekursiv) und ist mit Dateinamen und Zeilennummern, erschrick nicht ;)

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Hmm, ganz schön viel Stoff da ... wenn du den IPKG grep nehmen könntest, wäre das schlichter:
And the winner is itari
Code:
time /opt/bin/grep -Rl "listFileContents" /volume1/web
/volume1/web/include/template.php
/volume1/web/include/svnlook.php
real    0m 0.19s
user    0m 0.06s
sys     0m 0.14s
schneller gehts nimmer :D

Und noch der Code
Code:
#!/bin/sh
if [ "$1" = '-h' ] || [ "$1" = '--help' ] || [ $# -eq 0 ] ; then
 echo ""
 echo "Sucht rekursiv nach dem Vorkommen eines Strings in einer Datei"
 echo ""
 echo "Usage     : search nadel [heuhaufen]"
 echo "nadel     : String nach dem gesucht werden soll"
 echo "heuhaufen : fakultative Angabe des Suchpfades."
 echo "            Ohne heuhaufen wird im aktuellen Verzeichnis gesucht"
 exit
fi
if [ -z $1 ] ; then
 echo "Kein Suchstring angegeben"
 exit
fi

if [ -z $2 ] ; then
 pfad=$(pwd)
 echo "Starte Suche nach \"$1\" im aktuellen Verzeichnis ($pfad)"
else
 if [ -e $2 ] ; then
  pfad=$2
  echo "Starte Suche nach \"$1\" in $pfad"
 else
  echo "Pfad nicht gefunden ($2)"
  exit
 fi
fi
/opt/bin/grep -Rl "$1" $pfad
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Im Grunde könntest jetzt ne Art Datei Google draus machen.

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0

goetz

Super-Moderator
Teammitglied
Sehr erfahren
Mitglied seit
18. Mrz 2009
Beiträge
14.056
Punkte für Reaktionen
306
Punkte
393
Hi,
Rich (BBCode):
DS-106>search Goetz Wohnung
found 'Goetz' in 'Arbeitszimmer'
DS-106>search Nadel Bett
there is no 'Nadel' in 'Bett', good night!
Na dann kann ich ja getrost schlafen gehen:D.

Gruß Götz
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat 

 
 
  AdBlocker gefunden!

Du bist nicht hier, um Support für Adblocker zu erhalten. Dein Adblocker funktioniert bereits ;-)

Klar machen Adblocker einen guten Job, aber sie blockieren auch nützliche Funktionen.

Das Forum wird mit hohem technischen, zeitlichen und finanziellen Aufwand kostenfrei zur Verfügung gestellt. Wir zeigen keine offensive Werbung und bemühen uns um eine dezente Integration.

Bitte unterstütze dieses Forum, in dem du deinen Adblocker für diese Seite deaktivierst.

Du kannst uns auch über unseren Kaffeautomat einen Kaffe ausgeben oder ein PUR Abo abschließen und das Forum so werbefrei nutzen.

Vielen Dank für Deine Unterstützung!