Grep-Muster aus einer Datei lesen

49

Ich habe ein paar große Textdateien und in der Datei habe UNIQS.txtich eine Liste von Zeichenfolgen grepaus einer anderen Datei. Der Code, den ich benutze, ist

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

das macht nichts - die erzeugte datei ist leer. Aber wenn ich es mache

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

es funktioniert richtig. Das verwirrt mich, weil ich nicht dachte, grepdass die Einträge UNIQS.txtals reguläre Ausdrücke ohne Anführungszeichen und Schrägstriche interpretiert werden und so weiter in der Datei (die es nicht gibt). Ist es im Allgemeinen so, dass beim Abrufen von Mustern aus einer Datei automatisch davon ausgegangen wird, dass es sich um reguläre Ausdrücke handelt?

Bearbeiten: In der UNIQS.txtDatei befinden sich durch Zeilenumbrüche getrennte Zeichenfolgen des Formulars

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(als Vorlagennamen bezeichnet) und die EEP_VSL...Registerkarte " Datei" getrennte Spalten mit ungefähr 14 Spalten und die erste Spalte ist der Vorlagenname, daher möchte ich im Grunde die Zeile extrahieren, die jeder Vorlage in der Datei entspricht.

sdf
quelle

Antworten:

60

Die -fOption gibt eine Datei an, in der grep Muster liest. Das entspricht dem Übergeben von Mustern in der Befehlszeile (mit der -eOption, wenn mehrere vorhanden sind), mit der Ausnahme, dass Sie beim Aufrufen von einer Shell das Muster möglicherweise in Anführungszeichen setzen müssen, um zu verhindern, dass Sonderzeichen in der Shell erweitert werden.

Das Argument -Eoder -Foder -P, falls vorhanden, teilt grep mit, in welcher Syntax die Muster geschrieben sind. Ohne Argument erwartet grep grundlegende reguläre Ausdrücke . mit -E, erwartet grep erweiterte reguläre Ausdrücke ; mit -P(falls unterstützt) erwartet grep reguläre Perl-Ausdrücke ; und mit -Ferwartet grep wörtliche Zeichenketten. Es spielt keine Rolle, ob die Muster von der Befehlszeile oder aus einer Datei stammen.

Beachten Sie, dass die Zeichenfolgen Teilzeichenfolgen sind: Wenn Sie a+bals Muster übergeben, wird eine Zeile, die enthält, a+b+cabgeglichen. Wenn Sie nach Zeilen suchen möchten, die genau eine der angegebenen Zeichenfolgen enthalten und nicht mehr, übergeben Sie die -xOption.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Okay, das ist nützlich, danke. Kann ich fragen, ob ich die Zeichenfolge genau zuordnen möchte, dh wenn die Zeichenfolge 12345 ist, soll sie nur mit 12345 übereinstimmen, nicht mit 123456 oder 123455 usw., wie soll ich das tun?
sdf
2
@sdf Lies meinen letzten Absatz:-x
Gilles 'SO - hör auf böse zu sein'
Das ist so alt, tut mir leid, dass ich es ausgegraben habe. Obwohl die obige Erklärung großartig ist, ist es etwas vage, warum die Muster (Strings) aus der Datei ohne das -FFlag nicht übereinstimmen . Vermutlich wird -in der obigen Beispielzeile dies als Folge von Zeichen gelesen. Würde das nicht auch eckige Klammern erfordern? Ich habe mit einigen Beispieldateien getestet, bin aber noch nicht zu einem Ergebnis gekommen.
Trs
@trs Die in der Frage angezeigte Zeile (die hinzugefügt wurde, nachdem ich meine Antwort gepostet habe) enthält kein Zeichen, das in regulären Ausdrücken eine besondere Bedeutung hat, und verhält sich daher mit und ohne gleich -F. Es würde einen Unterschied machen bei Charakteren wie \[*^$.
Gilles 'SO - hör auf böse zu sein'
@ Gilles danke, das war auch mein Eindruck, aber der @sdf behauptet "die erzeugte Datei ist leer" (gelesen: keine Übereinstimmungen) ohne die -FFlagge?
Trs
0

Ich hatte den gleichen Fehler, nicht mit der guten Antwort von @gilles gelöst. Bei genauerem Hinsehen in der Eingabedatei habe ich am Ende zwei Zeilenumbrüche gefunden. Ohne diese wird nur folgender Erfolg benötigt: grep -i file_pattern_input file

(GNU grep 3.1, Eingabedatei mit mehr als 5000 Datensätzen, Matching / Pattern-Datei 2536, ich wusste, dass alle 2536 in der Datei sein müssen. Mit Newlines wurden alle Zeilen der Datei und ohne nur die 2536 Matching-Zeilen)

th_k
quelle
1
Das hat nichts mit dem Problem von OP zu tun. Eine leere Zeile wird von grep als leeres Muster gelesen, und ein leeres Muster stimmt überall überein.
muru