2014-06-15 47 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

相关问题