从CSV中提取文本

时间:2016-02-08 19:22:58

标签: regex bash awk sed grep

我想从snort规则中获取正则表达式。

以下是我作为csv保存的文字示例 - https://rules.emergingthreats.net/open/snort-2.9.0/rules/emerging-exploit.rules

所以有多个规则,

#by Akash Mahajan
#
alert udp $EXTERNAL_NET any -> $HOME_NET 14000 (msg:"ET EXPLOIT Borland VisiBroker Smart Agent Heap Overflow"; content:"|44 53 52 65 71 75 65 73 74|"; pcre:"/[0-9a-zA-Z]{50}/R"; reference:bugtraq,28084; reference:url,aluigi.altervista.org/adv/visibroken-adv.txt; reference:url,doc.emergingthreats.net/bin/view/Main/2007937; classtype:successful-dos; sid:2007937; rev:4;)

我只想要" pcre"之后出现的文字。在所有这些文件中,提取并打印到新文件中,不带引号

 pcre:"/[0-9a-zA-Z]{50}/R";

因此,从上面这一行开始,我想以下面的文字结尾;

 /[0-9a-zA-Z]{50}/R

来自每个地方" pcre"出现在整个文件中。

我一直在搞乱grep,awk和sed。我无法弄明白。我对此很新。

有人能给我一些提示吗?

由于

2 个答案:

答案 0 :(得分:1)

使用GNU sed:

$ sed -n -r 's/.*\<pcre:"([^"]+).*/\1/p' file
/[0-9a-zA-Z]{50}/R

答案 1 :(得分:0)

您可以使用grep执行此操作。但grep的问题是它不能只显示匹配的组,它只能显示匹配的文本。
为此,您需要使用前瞻和后视。

Lookahead(?= foo)
断言紧跟在字符串中当前位置之后的是foo

Lookbehind(?&lt; = foo)
断言紧接在字符串中当前位置之前的内容是foo

   ┌─ print file to standard output
   │                     ┌─ has pcre:" before matching group (look-behind)
   │                     │              ┌─ has "; after matching group (look-ahead)
cat file | grep -Po '(?<=pcre:\")(.*)(?=\";)'
                 ││               └─ what we want (matching group)
                 │└─ print only matched part
                 └─ all users