2011-02-23 53 views
0

获得一个字符串的一部分,我有几个日志文件,我用grep他们特定的字符串:在bash

grep UncategorizedLdap * 

,我得到〜33分的结果:

2009-01-01:org.springframework.ldap.UncategorizedLdapException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 1 - Operations Error]; remaining name 'ou=ABC' 
2009-01-02:org.springframework.ldap.UncategorizedLdapException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 1 - Operations Error]; remaining name 'ou=' 
2009-01-02:org.springframework.ldap.UncategorizedLdapException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 1 - Operations Error]; remaining name 'ou=ABD' 
2009-01-03:org.springframework.ldap.UncategorizedLdapException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 1 - Operations Error]; remaining name 'ou=ABE' 
... 

如何修改的grep致电退货

ou=ABC 
ou= 
ou=ABD 
ou=ABE 
... 

回答

1

可以通过管道输出到perl:

grep UncategorizedLdap * | perl -lpe '($_) = /(ou=\w*)/' 

如果你没有安装Perl中,这里有一个唯一的bash解决方案:

grep UncategorizedLdap * | 
while read line; do 
    line=${line#*\'} 
    line=${line%\'*} 
    echo $line 
done 
+0

我安装了Cygwin的perl的,但它不能正常工作 - 它打印整行。 – hsz 2011-02-23 10:14:33

+0

好的,仅bash解决方案就像一个魅力,谢谢! – hsz 2011-02-23 10:16:40

+0

@hsz:我想问题是用双引号。我发布了另一个Perl单线程 – 2011-02-23 10:25:24

1

如果你有GNU grep(其应该是Cygwin的情况):

grep -Po "UncategorizedLdap.*'\Kou.*?(?=')" * 

将选择行并在一个c中挑出字符串ommand。它使用Perl兼容的正则表达式来支持lookarounds。 \K之前的部分是一个倒序,用于进行匹配,但不包含在输出中。 (?=)里面的字符串在这种情况下是单引号,它是前瞻性的,它也不包含在输出中。 -o选项仅打印该行的匹配部分(未从输出中排除)。

1

如果你使用bash,那么有时你可以使用bash

for file in * 
    while read -r line 
    do 
    case "$line" in 
     *UncategorizedLdap*) 
      line=${line#*\'} 
      line=${line%\'*} 
      echo $line ;; 
    esac 
    done < $file 
done