Grep提取以某种模式开始和结束的单词

时间:2013-08-20 08:05:57

标签: shell unix grep

我有一个包含

等条目的日志文件
INFO 2013-08-16 13:46:48,660 Index=abc:12 insertTotal=11  ERROR: [doc=abc:d1c3f0]
INFO 2013-08-16 13:46:48,660 Index=abcd:12 insertTotal=11 ERROR: [doc=def:d1cwqw3f0]
INFO 2013-08-16 13:46:48,660 Index=def:134 insertTotal=11  
INFO 2013-08-16 13:46:48,660 Index=abkfe insertTotal=11
INFO 2013-08-16 13:46:48,660 Index=lmkfe insertTotal=11
INFO 2013-08-16 13:46:48,660 Index=lmkfe insertTotal=11

我需要点击 [doc = ] 之间的部分,即abc:d1c3f0和def:d1cwqw3f0 所以我希望做类似的事情 ^(ABC | DEF)*] $

2 个答案:

答案 0 :(得分:4)

sed

sed -n 's/.*\[doc=\(.*\)\].*/\1/p' filename

-n:不打印行

.*\[doc=匹配以[doc=

结尾的所有内容

\(.*\)在缓冲区中存储尽可能多的字符,同时仍然完成匹配

\].*匹配]后跟尽可能多的

\1替换所有与\(.*\)

的内容相匹配的内容

p打印此行

答案 1 :(得分:1)

grep救援:

$ grep -Po '(?<=\[doc=)[^\]]+' file
abc:d1c3f0
def:d1cwqw3f0

doc=(?<=\[doc=)部分)到]字符([^\]]+部分)之前的任何内容都可以获得所有内容。

awk

$ awk -F"[][=]" '{print $5}' file
abc:d1c3f0
def:d1cwqw3f0

-F"[][=]"定义了不同的可能字段分隔符[]=。然后,它打印出第5个“片段”。