是否可以改变 glob 的顺序?

是否可以改变 glob 的顺序?

我试图通过执行以下操作来按时间顺序显示系统日志中特定消息的所有实例:

grep squiggle /var/log/messages*

不幸的是,全局模式首先匹配当前活动的文件。例如。

/var/log/messages
/var/log/messages-20120220
/var/log/messages-20120227
/var/log/messages-20120305
/var/log/messages-20120312

这意味着最近的消息首先显示,然后按时间顺序显示历史消息。

是否可以以某种方式调整全局模式行为以使空匹配(即仅messages)显示在列表末尾?

如果没有,解决这个问题的好方法是什么?

答案1

在 zsh 中,您可以使用以下命令控制匹配的顺序(除其他外)全局限定符

echo /var/log/messages*        # usual lexicographic order
echo /var/log/messages*(On)    # reverse lexicographic order
echo /var/log/messages*(om)    # reverse chronological order (ascending mtime)
echo /var/log/messages*(Om)    # chronological order order (descending mtime)

(有关更多可能性,请参阅手册。)您甚至可以通过在最新版本中使用 或 提供比较函数来定义自己的排序oe顺序o+

在这里,文件的正确顺序是时间顺序。不过,您可以根据名称轻松模拟它,甚至在 bash 中也可以使用:

grep squiggle /var/log/messages{-*,}

答案2

我不知道如何更改通配顺序,但对于您的情况有一个简单的解决方法:

grep squiggle /var/log/messages-* /var/log/messages

即不匹配glob 模式中的文件,并将其添加到的参数列表的messages末尾。grep

答案3

您可以将反引号与 ls -tr 结合使用(按 mod 时间排序并反向排序),如下所示:

grep squiggle `ls -tr /var/log/messages*`

相关内容