2016-08-04 41 views
0

我想使用「grep/awk」或其他類似工具(例如「grep Proxy data.txt」)剪切文本文件,然後獲得「15988 「,從段落中獲得的與我想要查找的模式相關的數字(實際上是端口號)。任何一個端口擴展,通過使用 「============」 字如何從基於模式的上一行grep數據(不在行數之前)

有點類似與別人區分開來,但我變得頭暈 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"); 

我有做

grep "Proxy" aaa.txt 

結果(我知道我這樣做):

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 

只是wordering如何削減/ grep的所以結果變成了這個樣子:

15988 
15988 
15988 

感謝,

+4

閱讀[問]→[編輯]你的問題提供[MCVE]包括簡潔的,可測試的樣本輸入和預期的輸出加上你至今嘗試什麼。重要的是 - 使用文本,而不是圖片,因爲我們有一些東西來測試一個潛在的解決方案。 –

回答

2

一般來說,要獲得滿足ConditionA線之前的最後一行滿足ConditionB,你可以這樣做:

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

如果條件A條件B可能同時爲true,您需要更確切地定義您希望如何處理該案例。

但是,看着樣本輸入,似乎在你的情況:

  • ConditionA可能是這是在awk!/^SF:/「不SF:啓動」。

  • ConditionB可能是 「始於SF:和包含字符串Proxy」,這是/^SF:.*Proxy/awk

把這些結合在一起,你會得到:

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

,你可以重寫如:

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

我很困惑,找了幾天,你只需要幾秒鐘,,你太棒了,謝謝@Matei David – nurulhudamustaqim

+1

這個例子有所幫助。 :) –

1

這是你想要做的嗎?

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

上面使用GNU AWK的第三ARG匹配(),與其他awks它會是幾個子的()秒或類似隔離的端口號,例如:

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

或:

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