2014-06-15 77 views
0

我是unix的新手,並且使用sed和awk命令進行遊戲。 我的示例snort規則有多個關鍵字「內容」出現。我需要提取內容之間的所有數據:「和」;到一個文件。如何使用sed或grep命令提取兩個匹配模式之間的多個字符串出現

此示例包含單行中的一條規則。我的實際文件包含30k這樣的規則。

1rule文件包含

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"APP-DETECT Absolute Software Computrace outbound connection - search.namequery.com"; flow:to_server,established; content:"Host|3A| search.namequery.com|0D 0A|"; fast_pattern:only; http_header; content:"TagId: "; http_header; metadata:policy security-ips drop, ruleset community, service http; reference:url,absolute.com/support/consumer/technology_computrace; reference:url,www.blackhat.com/presentations/bh-usa-09/ORTEGA/BHUSA09-Ortega-DeactivateRootkit-PAPER.pdf; classtype:misc-activity; sid:26287; rev:4;) cat 4rules|sed 's/.*content:"\([^";]*\)".*/\1/'sdfjklhaskl;jdf;kljasdfsjkdfhnkl;asdjfklasdfja'sjkdsdfh;askldjf` 

預期輸出:

Host|3A| search.namequery.com|0D 0A| 

TagId 

\([^ 

我想我使用sed和grep命令。

grep -Po '(?<=content:").*(?=";)' 1rule 
sed 's/.*content:"\([^";]*\).*/\1/' 1rule 

我得到的輸出是不按預期:他們 的sed之間

使用grep,我可以看到所有的內容,但沒有中間數據給了我一個行中最後一次出現非匹配的行沿發生後。

請告訴我知道我該如何解決這個問題。

+0

爲什麼你不希望':「'和'」;'在這個':「APP-DETECT絕對軟件Computrace出站連接 - search.namequery.com之間的文本」;'? –

+0

@AvinashRaj:現在我試圖提取關鍵字內容之間的字符串:「and」;因爲Snort(入侵檢測系統)將內容字符串與傳入數據包進行比較 – Venkat

回答

1

隨着GNU grep(如你的問題,採取-P選項Perl兼容的正則表達式的優勢):

grep -Po 'content:"\K[^"]+' 1rule 
  • \K降到什麼是到目前爲止已經匹配:字段標籤和開"
  • [^"]+然後匹配字符串的內容直到但不包括關閉"

或者,嘗試awk具有以下:

awk -F'content:' '{ 
    for (i=2;i<=NF;++i) { 
     split($i, a, /"/); print a[2] 
    } 
    }' 1rule 
  • 將輸入線(S)成字段由分離器content:
  • 遍歷起始索引爲2的文件(因爲字段1是之前的字符串第一個content:子字符串)。
  • 將字段拆分爲標記"並打印第2個標記,該標記是在字段的開始處圍繞在"..."中的字符串。
+0

這是完美的。就像我需要的一樣。謝謝。 你能否建議一些很好的參考資料來快速學習awk – Venkat

+0

@Venkat:我很高興聽到它。我沒有具體的推薦建議,但我可以告訴你我是如何學到的:閱讀「man awk」並在這裏研究SO的答案。這裏有許多熟練的'awk'程序員,例如[@Ed Morton](http://stackoverflow.com/users/1745001/ed-morton) – mklement0

相關問題