Grep搜索特定字符麻烦

时间:2015-07-21 14:00:23

标签: regex linux grep

我已经广泛搜索过,无法弄清楚我在这里做错了什么。我有一个文本文件,可能包含类似于以下内容的字符串:

    public ActionResult Index(string typeControl, int? id_pred)
    {
        var node = MvcSiteMapProvider.SiteMaps.Current.FindSiteMapNodeFromKey("typeControl");
        if (node != null)
        {
            node.RouteValues["typeControl"] = typeControl;
        }
        ...

我通常知道直到磁盘百分比指示符(即11%)之前的sting会是什么样的,但是在字符串的最后部分我需要弄清楚它是否在usr(或sub)目录中结束。 / p>

我想使用grep进行此搜索但遇到问题。例如,以下命令为我提供输出,但一旦我替换任何“。” “G”或“%”的字符,或者如果我尝试在最后添加“/usr/.*”,则拒绝返回任何内容。

/dev/dir1/dir2   200G   22G  179G  11% /usr/dir3/dir4

1 个答案:

答案 0 :(得分:1)

grep的扩展正则表达式不支持使用\d来匹配数字。相反,请使用[0-9][:digit:]。您可以使用以下grep命令:

egrep '^/dev/dir1/dir2\s*[0-9]*G\s*[0-9]*G\s*[0-9]*G\s*[0-9]*%\s*.*$'

您还可以通过grep -P选项启用与Perl兼容的正则表达式,这些表达式支持\d

grep -P '^/dev/dir1/dir2\s*\d*G\s*\d*G\s*\d*G\s*\d*%\s*.*$'

注意在上面的命令中使用grep而不是egrep; -Pegrep不兼容。

作为旁注,我倾向于尽可能使用+而不是*,因为它更严格,可能会导致错误更快地显现出来。例如,我假设输入中的每个位置始终至少有一个空格和一个数字,因此您可以使用\s+[0-9]+(或\d+)。如果您的原始模式使用了+,那么它首先就不会匹配(无论是否引用),并且您甚至在添加G之前就已经知道您遇到了问题或%到它。一个工作的例子是

egrep '^/dev/dir1/dir2\s+[0-9]+.\s+[0-9]+.\s+[0-9]+.\s+[0-9]+.\s+.+$'