如何 grep 这两个文件,但排除其他文件

如何 grep 这两个文件,但排除其他文件

我们想通过 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命令之前完成的。

此外,使用zshshell,您可以轻松地自动通配符最后 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)

最后,对于您的情况来说可能是最简单的,您可以使用大括号扩展,如图所示在托马斯的回答中

相关内容