2009-01-12 9 views
25

Wie übertrage ich die Ausgabe von grep als Suchmuster für ein anderes grep?Pipe-Ausgabe als Suchspezifikation für grep unter Linux verwenden

Als Beispiel:

grep <Search_term> <file1> | xargs grep <file2> 

Ich möchte die Ausgabe des ersten grep als Suchbegriff für das zweite grep. Der obige Befehl behandelt die Ausgabe des ersten grep als den Dateinamen für das zweite grep. Ich habe versucht, die -e Option für das zweite Grep, aber es funktioniert auch nicht.

+0

Verwandte: * [Lesen Ausdruck für grep von der Standardeingabe] (http://stackoverflow.com/questions/6641731) * –

Antwort

8

Wenn Bash verwenden, dann können Sie verwenden Backticks:

> grep -e "`grep ... ...`" files 

die -e Flagge und die doppelten Anführungszeichen werden, um sicherzustellen, dass jede Ausgabe von der anfänglichen grep, die mit einem Bindestrich beginnt, wird dann nicht als eine interpretierte Option auf die zweite grep.

Beachten Sie, dass der doppelte Quoting-Trick (der auch dafür sorgt, dass die Ausgabe von grep als einzelner Parameter behandelt wird) nur mit Bash funktioniert. Es scheint nicht mit (t) csh zu arbeiten.

Beachten Sie auch, dass Backticks die Standardmethode sind, um die Ausgabe von einem Programm in die Parameterliste eines anderen Programms zu bringen. Nicht alle Programme haben eine bequeme Möglichkeit, Parameter von stdin so zu lesen, wie es (f) grep tut.

+1

Dieses könnte ein Problem haben, wenn das erste grep mehr als ein Ergebnis zurückgibt. –

+0

Ich habe die Lösung versucht, es funktioniert. Danke für die Bereitstellung. –

10

Versuchen

grep ... | fgrep -f - file1 file2 ... 
+1

was macht das? –

+0

Es verwendet die Ausgabe des ersten Grep als Grep-Muster für das zweite Grep, wie die Frage gestellt. –

+2

@Nathan, es verwendet die Ausgabe des ersten Grep als Eingabedatei von Mustern für fgrep. "-f -" ist die normale Art, einem Unix-Programm mitzuteilen, die Standardeingabe als Eingabedatei zu verwenden, wenn es normalerweise eine Eingabedatei verwendet. Traditionell war fgrep der einzige Grep, der eine Datei als Eingabe verwendet hat, obwohl es möglich ist, dass Gnu die anderen Greps modifiziert hat. –

12

Sie benötigen xargs ‚s -i Schalter zu verwenden:

grep ... | xargs -ifoo grep foo file_in_which_to_search 

Dies die Option nach -i nimmt (foo in diesem Fall) und ersetzt jedes Vorkommen es in dem Befehl mit dem Ausgang der ersten grep.

Dies ist das gleiche wie:

grep `grep ...` file_in_which_to_search 
+1

Die xargs replstr-Option verwendet einen Großbuchstaben -I unter OS X – Sphinges

-1

ich der folgende Befehl $ gefunden habe() mit meinem ersten Befehl in der Klammer arbeiten mit der Schale, um es zuerst auszuführen.

grep $(dig +short) file 

Ich verwende dies, um Dateien nach einer IP-Adresse zu durchsuchen, wenn mir ein Host-Name gegeben wird.

4

Ich wollte nach Text in Dateien (mit grep) suchen, die ein bestimmtes Muster in ihren Dateinamen (gefunden mit find) im aktuellen Verzeichnis hatten. Ich benutzen den folgenden Befehl ein:

grep -i "pattern1" $(find . -name "pattern2") 

Hier pattern2 das Muster in den Dateinamen und pattern1 ist das Muster für innerhalb von Dateien passend pattern2 gesucht.

bearbeiten: Nicht streng Rohrleitungen, aber immer noch verwandt und ziemlich nützlich ...

2

Dies ist, was ich für eine Datei aus einer Liste suchen:

ls -la | grep 'file-in-which-to-search' 
1

Okay, die Regeln zu brechen, da dies keine Antwort, nur ein Hinweis, dass ich keine dieser Lösungen erhalten kann arbeiten.

% fgrep -f test file 

funktioniert gut.

% cat test | fgrep -f - file 
fgrep: -: No such file or directory 

schlägt fehl.

% cat test | xargs -ifoo grep foo file 
xargs: illegal option -- i 
usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr] 
      [-L number] [-n number [-x]] [-P maxprocs] [-s size] 
      [utility [argument ...]] 

ausfällt. Beachten Sie, dass ein Kapital I notwendig ist. Wenn ich das nutze ist alles gut.

% grep "`cat test`" file 

funktioniert irgendwie, dass sie eine Linie für die Begriffe zurück, die passen, aber es gibt auch eine Reihe grep: line 3 in test: No such file or directory für jede Datei, die keine Übereinstimmung finden.

Fehle ich etwas oder sind das nur Unterschiede in meiner Darwin-Distribution oder Bash-Shell?

1

Ich habe diesen Weg versucht, und es funktioniert super.

[[email protected] abc]$ cat a 
not problem 
all 
problem 
first 
not to get 
read problem 
read not problem 

[[email protected] abc]$ cat b 
not problem xxy 
problem abcd 
read problem werwer 
read not problem 98989 
123 not problem 345 
345 problem tyu 

[[email protected] abc]$ grep -e "`grep problem a`" b --col 
not problem xxy 
problem abcd 
read problem werwer 
read not problem 98989 
123 not problem 345 
345 problem tyu 

[[email protected] abc]$