对于一个开发或运维人员而言, 当系统出现故障时, 第一步常常就是查看日志. 查看日志经常碰到的一个需求就是按关键字去搜索, 在日常开发机子上的 IDE 上, 都集成了强大的搜索功能, 但因为系统通常部署在 Linux 系统上, 一般只有命令行界面, 在其上应该怎么去搜索呢? 恐怕有些同学就不是那么清楚了.
有些人会用 ftp 之类的把日志下载下来本地再搜索, 如果是小一点的文件还好, 但日志文件往往都比较大, 因此这样的方式无疑是极为低效的.
下面就介绍一种相对快捷的方式, 也不需要用到特别高级的命令, 仅需要 tail 和 grep 两个命令结合起来即可, 能达到这样一个效果:
能按关键字搜索;在显示关键字所在行时还能高亮关键字;能把关键字所在行的上下文, 比如上下 10 行的内容也一起显示出来.下面是一个效果示意图:
在这里, 我用我云主机的 nginx access log 做了个示范, 我搜索一篇文章 url 的关键字 "a-port", 然后显示出搜索的结果及上下文, 可以看到关键字被标红显示, 上下文也有显示, 多个搜索结果间以蓝色的短横间隔开来.
下面具体说说怎么实现这样的搜索, 先具体讲讲各个命令及参数, 再说说怎么结合起来, 最后还给出一个脚本化的高级用法.
tail 命令
首先是 tail 命令. 因为查看日志通常从后面最新的日志去看, tail 命令就是从后往前找.
比如下述命令会显示 access.log 的最后 10 行的内容:
tailaccess.log
tail 指定行数
默认情况下, tail 只会显示最后的 10 行, 对于一个日志很多的应用来说, 这可能是不够的, 为此我们需要搜索更多的行.
如果想实时查看日志, 可以参考之前的这篇文章使用 tail -f 实时观测服务器日志输出
tail 可以结合 -n 参数指定一个行数, 比如下述命令会显示最后的 30 行的日志:
tail-n 30 access.log
注: 如果不太能记住参数, 还可以使用 -n 的完整命令参数 --lines:tail--lines 30 access.log
grep 命令
tail 仅能打印显示日志, 很多时候这是不够的, 日志通常非常多, 而且很多是没有用, 我们还需要能过滤, 或者说搜索筛选日志的内容, 这时就可以使用 grep 命令.
grep 命令的基本用法是这样的. 假如你有一个文件 index.html, 你想在其中搜索一个关键词 official, 你可以这样用:
grepofficial index.html
结果如下: