如何跨路径筛选查看日志文件中指定内容的条目?
如何跨路径筛选查看日志文件中指定内容的条目?
看来你是想从不在当前目录的日志文件里筛选出包含特定内容的条目对吧?我来帮你梳理下问题,再给你几个实用的解决方案~
首先得说下你原来用的命令为啥会出问题:
你的命令里find . /opt/logs/files.local/example.log -exec cat -b example.log {} \; | grep 48=login 有几个明显的问题:
find的第一个参数是搜索路径,你把具体的日志文件路径也放进去了,完全没必要;-exec里的cat -b example.log {}写法错误,{}代表find找到的每个结果,你这样相当于重复去cat指定的example.log和每个搜索到的文件,自然会输出一堆冗余内容;- 其实根本不需要用
cat再管道给grep,grep本身就能直接读取文件内容并筛选,多这一步纯属画蛇添足。
接下来根据你的需求分两种场景给你正确的命令:
场景1:已经知道日志文件的准确路径
如果你明确知道要找的日志是/opt/logs/files.local/example.log,那直接用grep就够了,简单高效:
- 筛选出包含目标字符串(比如"rejection 20")的行:
grep "rejection 20" /opt/logs/files.local/example.log
- 如果需要显示匹配行的行号,加
-n参数:
grep -n "rejection 20" /opt/logs/files.local/example.log
- 要是想看看匹配行的上下文(比如前后2行),可以用
-A(后几行)和-B(前几行)参数:
grep -A 2 -B 2 "rejection 20" /opt/logs/files.local/example.log
场景2:不知道具体哪个日志文件,需要批量搜索
如果你的目标是在某个目录下(比如/opt/logs/files.local)搜索所有.log文件里的匹配内容,这时候才需要结合find和grep,正确写法有两种:
- 用
find + exec:
find /opt/logs/files.local -name "*.log" -exec grep "rejection 20" {} \;
- 更高效的
find + xargs写法(还会自动显示匹配内容来自哪个文件):
find /opt/logs/files.local -name "*.log" | xargs grep "rejection 20"
备注:内容来源于stack exchange,提问作者Rickon




