在bash
问题描述:
获得一个字符串的一部分,我有几个日志文件,我用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
...
?
答
可以通过管道输出到perl:
grep UncategorizedLdap * | perl -lpe '($_) = /(ou=\w*)/'
如果你没有安装Perl中,这里有一个唯一的bash解决方案:
grep UncategorizedLdap * |
while read line; do
line=${line#*\'}
line=${line%\'*}
echo $line
done
答
如果你有GNU grep
(其应该是Cygwin的情况):
grep -Po "UncategorizedLdap.*'\Kou.*?(?=')" *
将选择行并在一个c中挑出字符串ommand。它使用Perl兼容的正则表达式来支持lookarounds。 \K
之前的部分是一个倒序,用于进行匹配,但不包含在输出中。 (?=)
里面的字符串在这种情况下是单引号,它是前瞻性的,它也不包含在输出中。 -o
选项仅打印该行的匹配部分(未从输出中排除)。
答
如果你使用bash,那么有时你可以使用bash
for file in *
while read -r line
do
case "$line" in
*UncategorizedLdap*)
line=${line#*\'}
line=${line%\'*}
echo $line ;;
esac
done < $file
done
我安装了Cygwin的perl的,但它不能正常工作 - 它打印整行。 – hsz 2011-02-23 10:14:33
好的,仅bash解决方案就像一个魅力,谢谢! – hsz 2011-02-23 10:16:40
@hsz:我想问题是用双引号。我发布了另一个Perl单线程 – 2011-02-23 10:25:24