我们想通过 grep 搜索两个文件的字符串:
这些文件是
/confluent/logs/server.log
/confluent/logs/server.log.1
但我们不想将其他文件匹配为
/confluent/logs/server.log.2
/confluent/logs/server.log.3
ETC
所以改为执行 double grep as
grep log.retention.bytes /confluent/logs/server.log
grep log.retention.bytes /confluent/logs/server.log.1
我们想log.retention.bytes
同时找到两个文件的匹配项
我们尝试做
grep log.retention.bytes /opt/mcspace/confluent/logs/server.log.*[1]
但这是错误的
答案1
grep log.retention.bytes server.log{,.1}
为了按时间顺序保留日志条目(附加),您可能需要反转文件的顺序:
grep log.retention.bytes server.log{.1,}
这当然相当于:
grep log.retention.bytes server.log.1 server.log
因为大括号扩展是由 shell 在执行grep
命令之前完成的。
此外,使用zsh
shell,您可以轻松地自动通配符最后 N 个与模式匹配的文件和:
grep log.retention.bytes server.log*(Om[-2,-1])
其中Om
意味着按时间降序排列并[-2,-1]
获取最后 2 行。如果您想搜索更多文件并且不想手动输入它们,那么这个技巧值得记住。
答案2
在两个文件中进行 grep 的最简单方法是将这两个文件都提供给 grep:
grep log.retention.bytes /confluent/logs/server.log /confluent/logs/server.log.1
当您有更多文件时,您可以手动列出所有文件,也可以使用仅与您的特定文件匹配的 glob。例如,在 bash 中:
shopt -s extglob
grep log.retention.bytes /confluent/logs/server.log?(.1)
最后,对于您的情况来说可能是最简单的,您可以使用大括号扩展,如图所示在托马斯的回答中。