2016-08-04 9 views
0

Ich möchte Textdatei mit "grep/awk" oder anderen ähnlichen Werkzeugen, zum Beispiel "grep Proxy data.txt" schneiden dann habe ich "15988 ", Die Nummer, die von dem Absatz erhalten wird, der mit dem Muster verknüpft ist, das ich finden möchte (das ist eigentlich Port-Nummer). jeder Port expandierte mit anderen zeichnen sich durch Verwendung von "============" CharakterWie man Daten von vorheriger Linie basierend auf Muster (nicht vor der Nummer der Linie) greppt

etwas ähnlich, aber ich wurde schwindlig How can I make 'grep' show a single line five lines above the grepped line?

http://prntscr.com/c1oq06

==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)============== 
SF-Port15988-TCP:V=7.01%I=7%D=8/3%Time=57A107C3%P=i586-pc-linux-gnu%r(GetR 
SF:equest,24E,"HTTP/1\.1\x20404\x20Not\x20found\r\nConnection:\x20close\r\ 
SF:nDate:\x20Tue,\x2002\x20Aug\x202016\x2020:44:05\x20GMT\r\nContent-Type: 
SF:\x20text/html\r\nContent-Length:\x20407\r\nExpires:\x200\r\nCache-Contr 
SF:ol:\x20no-cache\r\nPragma:\x20no-cache\r\n\r\n<!DOCTYPE\x20HTML\x20PUBL 
SF:IC\x20\"-//W3C//DTD\x20HTML\x204\.01\x20Transitional//EN\"\x20\"http:// 
SF:www\.w3\.org/TR/html4/loose\.dtd\">\n<html><head>\n<title>Proxy\x20erro 
SF:r:\x20404\x20Not\x20found\.</title>\n</head><body>\n<h1>404\x20Not\x20f 
SF:ound</h1>\n<p>The\x20following\x20error\x20occurred\x20while\x20trying\ 
SF:x20to\x20access\x20<strong>/</strong>:<br><br>\n<strong>404\x20Not\x20f 
SF:ound</strong></p>\n<hr>Generated\x20Wed,\x2003\x20Aug\x202016\x2003:44: 
SF:05\x20WIT\x20by\x20rpc\x20on\x20<em>sevdev:15988</em>\.\n</body></html> 
SF:\r\n")%r(HTTPOptions,258,"HTTP/1\.1\x20501\x20Method\x20not\x20implemen 
SF:ted\r\nConnection:\x20close\r\nDate:\x20Tue,\x2002\x20Aug\x202016\x2020 
SF::44:05\x20GMT\r\nContent-Type:\x20text/html\r\nContent-Length:\x20404\r 
SF:\nExpires:\x200\r\nCache-Control:\x20no-cache\r\nPragma:\x20no-cache\r\ 
SF:n\r\n<!DOCTYPE\x20HTML\x20PUBLIC\x20\"-//W3C//DTD\x20HTML\x204\.01\x20T 
SF:ransitional//EN\"\x20\"http://www\.w3\.org/TR/html4/loose\.dtd\">\n<htm 
SF:l><head>\n<title>Proxy\x20error:\x20501\x20Method\x20not\x20implemented 
SF:\.</title>\n</head><body>\n<h1>501\x20Method\x20not\x20implemented</h1> 
SF:\n<p>The\x20following\x20error\x20occurred:<br><br>\n<strong>501\x20Met 
SF:hod\x20not\x20implemented</strong></p>\n<hr>Generated\x20Wed,\x2003\x20 
SF:Aug\x202016\x2003:44:05\x20WIT\x20by\x20rpc\x20on\x20<em>sevdev:15988</ 
SF:em>\.\n</body></html>\r\n")%r(RTSPRequest,26C,"HTTP/1\.1\x20400\x20Erro 
SF:r\x20in\x20first\x20request\x20line\r\nConnection:\x20close\r\nDate:\x2 
SF:0Tue,\x2002\x20Aug\x202016\x2020:44:05\x20GMT\r\nContent-Type:\x20text/ 
SF:html\r\nContent-Length:\x20419\r\nExpires:\x200\r\nCache-Control:\x20no 
SF:-cache\r\nPragma:\x20no-cache\r\n\r\n<!DOCTYPE\x20HTML\x20PUBLIC\x20\"- 
SF://W3C//DTD\x20HTML\x204\.01\x20Transitional//EN\"\x20\"http://www\.w3\. 
SF:org/TR/html4/loose\.dtd\">\n<html><head>\n<title>Proxy\x20error:\x20400 
SF:\x20Error\x20in\x20first\x20request\x20line\.</title>\n</head><body>\n< 
SF:h1>400\x20Error\x20in\x20first\x20request\x20line</h1>\n<p>The\x20follo 
SF:wing\x20error\x20occurred:<br><br>\n<strong>400\x20Error\x20in\x20first 
SF:\x20request\x20line</strong></p>\n<hr>Generated\x20Wed,\x2003\x20Aug\x2 
SF:02016\x2003:44:05\x20WIT\x20by\x20rpc\x20on\x20<em>sevdev:15988</em>\.\ 
SF:n</body></html>\r\n"); 

ich habe getan

grep "Proxy" aaa.txt 

das Ergebnis (ich weiß, was ich tue):

SF: www \ .w3 \ .org/TR/HTML4/loose \ .dtd \ "> \ n <html> <head> \ n <title> Proxy \ x20erro 
SF: l> <head> \ n <title> Proxy \ x20error: \ x20501 \ x20Method \ x20not \ x20implemented 
SF: org/TR/HTML4/loose \ .dtd \ "> \ n <html> <head> \ n <title> Proxy \ x20error: \ x20400 

nur wordering wie/grep zu schneiden, so das Ergebnis so geworden:

15988 
15988 
15988 

,

+4

Read [fragt] dann [Bearbeiten] Ihre Frage auf den [MCVE] einschließlich prägnant, prüfbare Abtastwerteingang und erwartete Leistung plus, was Sie bisher versucht haben, zur Verfügung zu stellen. Wichtig - verwenden Sie für Beispiele Text, nicht Bilder, damit wir etwas gegen eine mögliche Lösung testen können. –

Antwort

2

Im Allgemeinen Danke, die letzte Zeile zu erhalten, die ConditionA vor einer Linie erfüllt, daß erfüllt ConditionB, könnten Sie tun:

awk 'ConditionA {last=$0} ConditionB {print last}' 

Wenn BedingungA und BedingungB könnte gleichzeitig wahr sein, müssen Sie genauer definieren, wie Sie mit diesem Fall umgehen möchten.

Aber am Abtastwerteingang suchen, scheint es, dass in Ihrem Fall:

  • ConditionA könnte sein, "nicht mit SF: starten", die !/^SF:/ in awk ist.

  • ConditionB könnte "beginnt mit SF: und enthält den String Proxy", die /^SF:.*Proxy/ in awk

Setzt man diese zusammen ist, erhalten Sie:

awk '!/^SF:/ {last=$0} /^SF:.*Proxy/ {print last}' 

Welche Sie umschreiben könnte wie:

awk '!/^SF:/ {last=$0; next} /Proxy/ {print last}' 
+0

Ich war verwirrt, ein paar Tage zu finden, Sie brauchen nur ein paar Sekunden, Sie sind erstaunlich, danke @Matei David – nurulhudamustaqim

+1

Das Beispiel half. :) –

1

Wollen Sie das?

$ awk 'match($0,/^SF-Port([0-9]+).*/,a){port=a[1]} /Proxy/{print port}' file 
15988 
15988 
15988 

Die oben verwendet GNU awk für die 3. arg() übereinstimmen, mit anderen awks würde es ein paar sub() s oder ähnlich sein, die Portnummer zu isolieren, z.B.:

$ awk 'sub(/^SF-Port/,""){sub(/[^0-9].*/,""); port=$0} /Proxy/{print port}' file 
15988 
15988 
15988 

oder:

$ awk 'match($0,/^SF-Port[0-9]+/){port=substr($0,8,RLENGTH-7)} /Proxy/{print port}' file 
15988 
15988 
15988 
Verwandte Themen