2016-08-31 5 views
3

sagen, dass ich eine Datei, die enthält:grep multipe Platzhalter in string

Release 2.1 OS: RHEL File: package_el6_2.0.1.1_x86_64.rpm 
Release 2.1 OS: RHEL File: package_el6_2.0.1.1_i686.rpm 
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_x86_64.rpm 
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_i686.rpm 

Ich möchte grep und Anpassungsleitungen, die nur 'Paket', 'el6' und 'x86_64' enthalten

Wie Würde ich das auf einem One-Liner mit Grep machen? Die Zeile muss alle drei übereinstimmen und Grep sollte nicht darauf achten, wie viele Zeichen dazwischen sind. Wenn es ein besseres Werkzeug für den Job gibt, bin ich froh, das stattdessen zu verwenden.

Ich habe die folgende und bekam keine Ergebnisse versucht:

grep package*el6*x86_64* 

Sehen Beiträge und Dokumentation, ich verstehe, dass * bedeutet nicht das Gleiche, wie es in der Schale würde. Ich suche nach dem Äquivalent, um es in Regex zu verwenden. Hoffe, das macht Sinn.

+0

Haben Sie etwas überhaupt versucht? Was ist die Ausgabe der Sache, die du probiert hast? –

+0

@MadPhysicist Ich habe, aber ich habe eine Menge Probleme bei der Suche nach einer Möglichkeit, einen Platzhalter für eine beliebige Anzahl von Zeichen einzufügen. Habe nicht viel gegoogelt und die Manpage gelesen. –

+0

Das ist in Ordnung. Schreibe deine Versuche auf und was ist hier schief gelaufen. Auf diese Weise werden Sie eher konstruktive Hilfe bekommen. So wie es aussieht, zeigt Ihre Frage keine Anstrengung von Ihrer Seite. –

Antwort

5

Ihr Versuch, ganz in der Nähe ist. * in Shell-Begriffe ist in etwa gleichzusetzen mit .* in Regex-Bedingungen. . bedeutet „ein beliebiges Zeichen“ und * Mittel „ist (einschließlich Null) beliebig oft wiederholt

Ihre regex . muss vor jeder * Die Hinter * nicht notwendig ist..

package.*el6.*x86_64 

Hier ein Probelauf mit Ihrem Eingang:

grep 'package.*el6.*x86_64' <<< "Release 2.1 OS: RHEL File: package_el6_2.0.1.1_x86_64.rpm 
Release 2.1 OS: RHEL File: package_el6_2.0.1.1_i686.rpm 
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_x86_64.rpm 
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_i686.rpm" 

Drucke:

Release 2.1 OS: RHEL File: package_el6_2.0.1.1_x86_64.rpm 
+2

Benötigt mehr Anführungszeichen, um jede Möglichkeit der Shell zu verhindern, die dieses Argument als glob behandelt. –

+4

Insbesondere sollte es sein: 'grep 'Paket. * El6. * X86_64''. Andernfalls kann die Shell den Vorgang als Fehler behandeln, ohne grep selbst auszuführen (wenn die Option failglob gesetzt ist), oder den Ausdruck durch eine Liste von Dateinamen im aktuellen Verzeichnis ersetzen, die bei der Interpretation als glob übereinstimmen , oder löschen Sie dieses Argument direkt (wenn die Option 'nullglob' gesetzt ist). –

+0

Danke für Ihre Hilfe. Genau das, was ich brauchte. –

-3

können Sie verwenden egrep

egrep 'package|el6|x86_64' name_of_file.txt 
+1

Dies entspricht entweder nicht allen drei. –

+0

Versuchen Sie Dateien zu finden, die alle drei Strings enthalten? Etwas wie: grep -l Paket name_of_file.txt | xargs grep -l e16 | xargs grep -l x86_64? – connollyc4

+2

@ connollyc4, lesen Sie die Frage erneut - es ist sehr explizit, dass alle drei Zeichenfolgen vorhanden sein müssen. –

2

Nicht die beste Lösung (in der Tat ineficient), aber wirklich leicht zu merken: Werden Sie Mitglied 3 greps

grep "package" | grep "el6" | grep "x86_64" 
+1

Wenn die Reihenfolge der drei Elemente nicht im Voraus festgelegt wurde, wäre dies wohl der beste Weg, dies zu tun. Daher der Upvote. –

+0

Nein, wenn die Bestellung nicht garantiert ist, benutze einfach awk anstelle einer Kette von Greps mit Pfeifen: 'awk '/ package/&&/el6/&&/x86_64 /' file.txt' –

+0

Hoppla, du hast Recht, meine Antwort ist nicht genau das, was nach –

0

Wenn sie guarenteed sind, um zu sein, dann ein einfaches grep:

grep "package.*el6.*x86_64" file.txt 

würde es tun. Wenn die Elemente in beliebiger Reihenfolge angegeben werden kann, können Sie ein Rohr versuchen:

cat file.txt | grep package | grep el6 | grep x86_64 

werden nur Linien zeigen alle drei enthalten, aber in beliebiger Reihenfolge

+0

'grep package file.txt | grep el6 | grep x86_64' ist eine Alternative für die letzte. –

+0

Wenn die Bestellung nicht garantiert ist, verwenden Sie einfach awk anstelle einer Kette von Greps mit Pfeifen: 'awk '/ package/&&/el6/&&/x86_64 /' file.txt'. –