2009-07-05 1 views
3

alle PHP-Dateien zu sehen, die „abc“ Ich kann dieses einfache Skript enthalten verwenden:ein Shell-Skript schreiben, das und gibt Dateinamen und den Inhalt in 1 line-greps finden

find . -name "*php" -exec grep -l abc {} \; 

ich die -l weglassen und ich bekomme einen Teil des Inhalts anstelle der Dateinamen als Ergebnisse extrahiert:

find . -name "*php" -exec grep abc {} \; 

Was würde ich mag jetzt ist eine Version, die beide zur gleichen Zeit der Fall ist, aber auf der gleichen Linie.

Erwartete Ausgabe:

path1/filename1: lorem abc ipsum 
path2/filename2: ipsum abc lorem 
path3/filename3: non abc quod 

Mehr oder weniger wie grep abc * tut.

Edit: Ich möchte dies als ein einfaches Shell-Skript verwenden. Es wäre großartig, wenn die Ausgabe in einer Zeile wäre, also wäre ein weiteres Greifen möglich. Aber es ist nicht notwendig, dass das Skript nur eine Zeile ist, ich stelle es sowieso in eine Bash-Skript-Datei.

Bearbeiten 2: Später fand ich "ack", das ist ein großartiges Werkzeug und ich benutze das jetzt in den meisten Fällen anstelle von Grep. Es macht all dies und mehr. http://betterthangrep.com/ Sie würden ack --php --nogroup abc schreiben das gewünschte Ergebnis zu erhalten

Antwort

7

Verwenden Sie den -H Schalter (man grep):

find . -name "*php" -exec grep -H abc {} \; 

Alternative mit xargs (jetzt -H Schalter nicht, zumindest für die Version von grep Ich habe benötigt hier):

find . -name "*php" -print | xargs grep abc 

Edit: Als Konsequenz von grep Verhalten von orsogufo, sollte der zweite Befehl oben -H verwenden, wenn find denkbar wäre, nur einen einzigen Dateinamen (d. H. wenn es nur eine einzige PHP-Datei gibt). Wenn orsogufos Kommentar w.r.t. -print0 ebenfalls eingearbeitet wird, wird der Befehl:

find . -name "*php" -print0 | xargs -0 grep -H abc 

Edit 2: A (mehr) POSIX kompatible Version, wie durch Jonathan Leffler vorgeschlagen, die durch die Verwendung von /dev/null die -H Schalter vermeiden:

find . -name "*php" -print0 | xargs -0 grep abc /dev/null 

: Ein Zitat aus der opengroup.org manual on find Hinweise, dass -print0 Nicht-Standard ist:

Ein Merkmal finden Dienstprogramm SVR4 war der -exec Terminator + primäre.Diese erlaubt Dateinamen mit speziellen Zeichen (vor allem s) bis zusammen gruppiert werden ohne die Probleme, die auftreten, wenn solche Dateinamen sind piped zu xargs. Andere Implementierungen haben andere Möglichkeiten hinzugefügt , um dieses Problem zu umgehen, vor allem eine -print0 primäre, die Dateinamen mit einem Nullbyte-Terminator schrieb. Dies wurde hier betrachtet, aber nicht angenommen. Mit einem Null-Terminator bedeutete, dass alle Dienstprogramm, das Find's -print0 Ausgabe verarbeitet wurde, musste eine neue Option zum Parsen der Null-Terminatoren es würde jetzt lesen.

+0

Die -H nicht mit xargs benötigt wird, da grep ist mehr als eine Datei auf dem Zeilenbefehl empfängt, und in diesem Fall ist es gibt den Dateinamen zusammen mit dem Capture aus; Ich denke, es ist ein Standardverhalten und sollte auch auf anderen Greps funktionieren. Beachten Sie, dass es besser ist, 'find ... -print0' zu verwenden und die Ausgabe nach 'xargs-0' zu leiten, so dass ein 0-Trennzeichen verwendet wird und Ihr Befehl auch mit fiesen Dateinamen funktioniert (zB mit Leerzeichen) . –

+0

Vielen Dank für Ihren Kommentar. Ich habe die Antwort aktualisiert. – Stephan202

+0

Beachten Sie, dass die andere Möglichkeit, die Möglichkeit einer Datei an grep übergeben zu können, darin besteht, den Befehl/dev/null hinzuzufügen, sodass grep immer mindestens zwei Dateien durchsuchen muss. Die '-H'-Option für Grep ist nicht Teil der POSIX-Spezifikation - es ist eine nützliche GNU-Erweiterung. –

2

Wenn Sie nicht rekursiv suchen müssen, können Sie einfach tun ..

grep -H abc *.php 

..welche Sie die gewünschte Ausgabe gibt. -H ist das Standardverhalten (zumindest auf der OS X-Version von grep), so können Sie diesen Schritt auslassen:

grep abc *.php 

können Sie grep die -R Flag rekursiv verwenden, aber Sie sind nicht in der Lage Grenze es zu .php Dateien:

grep -R abc * 

Wieder hat dies die gleiche gewünschte Ausgabe.

Ich weiß, das Ihre Fragen beantworten nicht genau, es ist einfach ist .. eine Alternative ... Die oben ist grep nur mit einer einzigen Fahne, so leichter zu merken als find/-exec/grep/xargs Kombinationen! (Irrelevant für ein Skript, aber nützlich für Tag zu Tag shell'ing)

1
find /path -type f -name "*.php" | awk ' 
{ 
    while((getline line<$0)>0){ 
     if(line ~ /time/){ 
      print $0":"line 
      #do some other things here 
     } 
    }  
}' 
Verwandte Themen