2012-04-03 3 views
0

Ich habe eine Textdatei, die Zeichenfolgen in doppelte Anführungszeichen eingeschlossen haben. Ich möchte diese Zeichenfolgen extrahieren und eine andere Datei überprüfen, um zu sehen, ob sie existiert oder nicht. Gerade jetzt, ich habe so weit wie:awk und grep für Existenz

awk -F'"' '{print $2}' ~/test | <GREP COMMAND> 

Wie gehe ich durch die extrahierten Zeichenketten in einer Art einer Schleife mit meinem Befehl grep?

Antwort

1

Wenn Sie GNU Grep haben;

grep -f - file 

Wenn nicht, könnten Sie einen sed Skript von awk ausdrucken, oder vielleicht einen etwas komplizierteren awk-Skript erstellen. Oder verbinden Sie einfach die Ausgabe in einen großen Ausdruck;

egrep "$(awk -F'"' '{ printf ("%s%s", j, $2); j="|" }' input)" 
+0

Diese Lösung war auch ziemlich cool effizienter als die spawn-a-grep-jedesmal – syker

+0

Im printf-Befehl, warum kam j vor $ 2? Ich testete es mit $ 2 zuerst und die meine erste und zweite Zeichenfolgen waren nicht Pipe-begrenzt. t scheint zu sehen, warum $ 2 nicht zuerst sein sollte. – syker

+0

Auch eine andere Frage, wie umgibt man das 'awk-Ergebnis mit einer anderen Zeichenfolge. Angenommen, ich wollte mit title = "" übereinstimmen, wobei das röhrenbegrenzte Ergebnis von " $ (awk -F '' '' '{printf ("% s% s", j, $ 2); j = "|"}' Eingabe) " – syker

2

Schauen Sie sich xargs an, die Zeilen von der Standardeingabe liest und einen bestimmten Befehl für jede Zeile einmal ausführt. Es wird davon abhängen, welche Version von xargs Sie installiert haben, aber ich würde mit so etwas wie folgt beginnen:

awk -F'"' '{print $2}' ~/test | xargs -I % grep % <file> 

Die -I % Flag teilt es % mit dem Argument von stdin gelesen zu ersetzen, anstatt sie an das Anhängen Ende der Kommandozeile, was der Standard ist.

+0

Dies ist ziemlich ineffizient; es wird für jede Suchphrase ein 'Grep' erzeugt. – tripleee

+0

Danke das hat gut für mich funktioniert: awk -F '"' '{print $ 2}' ~/test | xargs -I% grep 'name = \"% \ "' Datei – syker

1

Unquote die Saiten und Rohr als Musterdatei grep:

tr -d '"' < strings.txt | grep --file=- another_file.txt 

(Beachten Sie, dass diese korrekt mit entkam " Zeichen nicht verhalten, aber Ihr awk Befehl würde entweder nicht, so dass ich gehe davon aus, dass es kein Problem ist.)

Falls die Verwendung von --fixed-strings mit grep auch die Dinge beschleunigen wird.

+0

Ageee, dass 'tr-d '"' 'weit überlegen ist, wenn das Entfernen von führenden und abschließenden doppelten Anführungszeichen alles ist, was Sie für' awk' benötigen. – tripleee