2012-05-31 15 views
8

Ich verwende die grep -f Funktion, um Zeilen aus einer Datei zu extrahieren, die einem bestimmten Muster entsprechen. Lassen Sie uns sagen, meine Musterdatei ist pattern.txt, wie folgt.Über 'grep -f': Spielmuster mit Datei

1 
2 
3 
4 
5 

Und die Datei, gegen die ich dieses Muster file.txt ist, bin passend Jetzt

1::anv 
2::tyr 
3::yui 
4::fng 
5::gdg 
6::ere 
7::rer 
8::3rr 
9::gty 

, wenn ich ein grep -f pattern.txt datei.txt tun, erhalte ich diese ->

1::anv 
2::tyr 
3::yui 
4::fng 
5::gdg 
8::3rr 

Die letzte Zeile in der Ausgabe oben verursacht mein Problem. Wie ändere ich diesen grep-Befehl, um die Ausgabe (korrekte Übereinstimmungen anzeigen) wie folgt zu erhalten?

1::anv 
2::tyr 
3::yui 
4::fng 
5::gdg 
+0

Ich habe grep "' more patt.txt' "file.txt | versucht awk -F '::' '{print $ 1 $ "$ 2}' Aber das gibt mir auch das gleiche Problem. – ana

Antwort

12

^ vor Ihrem Muster hinzufügen, so dass grep wird eine Linie beginnen mit Ihrem Muster entsprechen. Wenn Ihr Muster tatsächlich aus Zahlen besteht, benötigen Sie keine Musterliste. Verwenden Sie einfach ^[1-5]:.

+0

Danke. das hat es getan. – ana

+4

nur darauf achten, dass^1 wird 10 übereinstimmen, usw., wenn die Zahlen jemals so groß werden. –

6

Nun, es gibt viele mögliche Lösungen. Sie sagen grep, um alle Zeilen zu finden, die eine 3 enthalten, und die Zeile "8 :: 3rr" enthält tatsächlich eine 3. Sie müssen genauer sein, was Sie suchen.

Zum Beispiel können Sie die Muster in '1:', '2:' usw. ändern, um nur mit Zahlen gefolgt von einem Doppelpunkt übereinzustimmen. Oder Sie könnten sie in '^ 1', '^ 2' usw. ändern, um nur Zahlen am Anfang der Zeile zu finden. Es hängt von Ihren Daten ab, aber wahrscheinlich möchten Sie beide, so dass Ihre Suche nach '1:' nicht mit '21: 'übereinstimmt und Ihre Suche nach'^5 'nicht mit '53:' übereinstimmt. In diesem Fall würde Ihre Musterdatei folgendermaßen aussehen:

^1: 
^2: 
^3: 
^4: 
^5: