如何使用sed或grep命令在两个匹配模式之间提取多个字符串出现

时间:2014-06-15 23:12:55

标签: unix awk sed grep

我是unix的新手并且使用sed和awk命令。 我的示例snort规则多次出现关键字“content”。我需要在内容之间提取所有数据:“和”;到一个文件。

此示例包含一行单行规则。我的实际文件包含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

我得到的输出并不像预期的那样:

使用grep,我可以看到所有内容,但它们之间有中间数据 sed给出了一行中最后一次出现以及出现后不匹配的行。

请告诉我如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

使用GNU grep(如您的问题,利用Perl兼容正则表达式的-P选项):

grep -Po 'content:"\K[^"]+' 1rule
  • \K删除了到目前为止匹配的内容:字段标签和开头"
  • [^"]+然后匹配字符串的内容,但不包括结束"

或者,请尝试使用以下内容awk

awk -F'content:' '{ 
    for (i=2;i<=NF;++i) {
      split($i, a, /"/); print a[2]
    }
  }' 1rule
  • 按分隔符content:
  • 将输入行拆分为字段
  • 循环以索引2开头的文件(因为字段1是字符串之前的第一个content:子字符串)。
  • 通过"将字段拆分为标记,并打印第二个标记,即字段开头"..."中包含的字符串。