【问题标题】:Regex to match logfiles 1 to 11正则表达式匹配日志文件 1 到 11
【发布时间】:2013-02-20 08:23:49
【问题描述】:

我想用一个正则表达式从 500 个日志文件中提取第 1 到 11 个日志文件:

log4j-cnode1.log.11  
log4j-cnode1.log.10  
log4j-cnode1.log.9  
log4j-cnode1.log.8  
log4j-cnode1.log.7  
log4j-cnode1.log.6  
log4j-cnode1.log.5  
log4j-cnode1.log.4  
log4j-cnode1.log.3  
log4j-cnode1.log.2  
log4j-cnode1.log.1

所以我不想获取 log4j-cnode1.log.12、log4j-cnode1.log.13、...、log4j-cnode1.log.500

我正在尝试这个命令:

find . -iname "log4j-cnode1*\.log\.(1[0-1]|[1-9])"

为什么这不起作用?

1 到 9 可以正常工作:

find . -iname "log4j-cnode1*\.log\.[1-9]"

【问题讨论】:

    标签: regex shell unix


    【解决方案1】:

    因为-iname 不接受正则表达式,即使接受,您的1* 也可能不是您想要的。使用-iregex:

    find -regextype posix-extended -iregex '(.*/)?log4j-cnode1.*\.log\.(1[0-1]|[1-9])'
    

    【讨论】:

    • 谢谢!我不知道find 默认不理解正则表达式。
    【解决方案2】:
    find . -iname "log4j-cnode1*\.log\.(1?[0-9])"
    

    您的正则表达式表示 1 后跟 0 或 1 后跟 1-9

    【讨论】:

    • 这也会显示我不想要的 12 到 19
    【解决方案3】:
    $ find -name 'log4j-cnode1*\.log\.[0-9]*'
    ./log4j-cnode1.log.1
    ./log4j-cnode1.log.10
    ./log4j-cnode1.log.11
    ./log4j-cnode1.log.2
    ./log4j-cnode1.log.3
    ./log4j-cnode1.log.4
    ./log4j-cnode1.log.5
    ./log4j-cnode1.log.6
    ./log4j-cnode1.log.7
    ./log4j-cnode1.log.8
    ./log4j-cnode1.log.9
    

    【讨论】:

      【解决方案4】:

      几乎正确。

      但是,不要使用-iname,而是使用-iregex-regextype egrep(或awk),如下所示:

      find . -regextype egrep \
          -iregex ".*log4j-cnode1.*\.log\.(1[0-1]|[1-9])"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-17
        • 2015-12-09
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 2011-05-15
        • 2013-02-11
        相关资源
        最近更新 更多