我不确定在bash中是否正确使用了正则表达式。我在一个使用bash-shell的Centos系统上。在我们的日志目录中,有一些附加了数字的日志文件,即
stream.log
stream.log.1
stream.log.2
...
stream.log.nnn
不幸的是,还有一些日志文件采用了新的命名约定
stream.log.2014-02-14
stream.log.2014-02-13
我需要获取具有旧日志文件命名格式的文件。我发现了一些有效的方法,但我想知道是否还有其他更优雅的方法。
ls -v stream.log* | grep -v 2014
我不知道正则表达式在bash中是如何工作的,也不知道输出到哪个命令(可能不是grep)
ls -v stream.log(.d{0,2})+
毫不奇怪,这并没有奏效。也许我的逻辑不正确,但我想从cmdline列表中说,名为stream.log的文件末尾有一个可选的.xyz,其中xyz={1..999}附加在末尾。请让我知道这是否可行,或者我提出的解决方案是否是做这样事情的唯一方法。提前感谢您的帮助。
编辑:感谢大家的及时评论和回复。我只是想提一下,还有一个名为stream.log
的文件,它后面没有任何数字,也需要将其添加到我的ls
列表中。我尝试了评论和答案中的提示,它们很有效,但它忽略了那个文件
您可以使用bash中的扩展模式匹配来实现这一点,例如
> shopt -s extglob
> ls *'.'+([0-9])
何处
+(pattern-list)
Matches one or more occurrences of the given patterns
以及其他有用的语法。
?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns
或者,如果没有扩展的模式匹配,可以使用不太整洁的解决方案
ls *'.'{1..1000} 2>dev/null
如果你有很多日志文件,可以用更大的数字替换1000。尽管我更喜欢grep选项而不是这个。
一种使用sed
:的方法
ls -v stream.log* | sed -nE '/log(.[0-9]+)?$/p'
一个使用egrep
:
ls -v stream.log* | egrep 'log(.[0-9]+)?$'
这些打印出以"log"结尾的行,可以选择一个句点和任何正数,后跟行的末尾。
只需关注旧日志文件格式中的短划线'-',就可以实现这一点。这是最低版本:
ls *-*
如果同一目录中有不同类型的日志文件,这可能会更安全:
ls stream.log.*-*
为了确保您获得一个额外的文件,生成一个令人困惑的正则表达式是没有意义的——只需将其包含在ls行中即可:
ls stream.log stream.log.*-*
参考@BroSlow的答案,这里是修复程序,其中也将包括stream.log。
shopt -s extglob
ls stream.log*(.)*([0-9])
stream.log stream.log.1 stream.log.2