grep, um Muster zu ignorieren

12

Ich extrahiere URLs von einer Website mit cURL (siehe unten).

curl www.somesite.com | grep "<a href=.*title=" > new.txt

Meine new.txt-Datei ist wie folgt.

<a href="http://website1.com" title="something">
<a href="http://website1.com" information="something" title="something">
<a href="http://website2.com" title="some_other_thing">
<a href="http://website2.com" information="something" title="something">
<a href="http://websitenotneeded.com" title="something NOTNEEDED">

Ich muss jedoch nur die folgenden Informationen extrahieren.

<a href="http://website1.com" title="something">
<a href="http://website2.com" information="something" title="something">

Ich versuche die zu ignorieren <a href, die Informationen enthalten und deren Titel mit NOTNEEDED endet .

Wie kann ich meine grep-Anweisung ändern?

Ramesh
quelle
Ist die Ausgabe, die Sie hier anzeigen, korrekt? Der Text, der dies beschreibt, ergibt zusammen mit diesem Beispiel keinen Sinn.
slm
1
Sind Sie nicht suchen curl www.somesite.com | grep "<a href=.*title=" | grep -v NOTNEEDED > new.txt?
Terdon
@terdon, genau das habe ich gesucht. Ich kann es als Antwort akzeptieren, wenn Sie es posten.
Ramesh
Ramesh, es ist im Grunde die Antwort von @ slm. Ich habe es gerade bearbeitet, damit Sie es akzeptieren können.
Terdon
oh ja, ich wusste nicht, dass Pipe so mächtig ist. Ich habe es als Antwort akzeptiert. Vielen Dank!
Ramesh

Antworten:

16

Ich folge Ihrem Beispiel + der Beschreibung nicht vollständig, aber es hört sich so an, als ob Sie folgendes wollen:

$ grep -v "<a href=.*title=.*NOTNEEDED" sample.txt 
<a href="http://website1.com" title="something">
<a href="http://website1.com" information="something" title="something">
<a href="http://website2.com" title="some_other_thing">
<a href="http://website2.com" information="something" title="something">

Also für dein Beispiel:

$ curl www.example.com | grep -v "<a href=.*title=" | grep -v NOTNEEDED > new.txt
slm
quelle
Ich habe eine Klasse in der Kategorie <a href. Grundsätzlich möchte ich das nicht in meiner Ausgabe.
Ramesh
9

Die grep- Manpage sagt:

-v, --invert-match
    Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX .) 

Sie können reguläre Ausdrücke für mehrere Inversionen verwenden:

grep -v 'red\|green\|blue'

oder

grep -v red | grep -v green | grep -v blue
YesThatIsMyName
quelle