Linux之tail、head命令详解

告诉你一下,我刚学Linux的时候,经常使用tail和head这两个命令。
非常有用,尤其是在处理大文件时。

记得有一次在杭州,我在公司做一个项目时出了问题。
日志文件非常大,有几千兆字节。
如果我尝试直接使用Cat,系统会严重冻结,几乎崩溃。
这时候你就需要使用你的尾巴了。
我直接输入 tail -f logs/error.log 。
这个-f 真是太神奇了。
我可以看到实时添加的新日志,无需刷新。
您可以立即看到任何错误,从而省去很多麻烦。

还有一次,在广东的一个外包项目中,需要检查脚本的最后几行是否有特定的返回值。
文件也不小。
我直接用tail -n 5 0 script.sh |抓住“成功”,很快就找到了。
这非常有效。
你看,-n指定了行数,多方便啊。

头部也是如此。
虽然不像尾巴那么常用,但还是有用的。
记得有一次在成都,我想快速检查一下配置文件是否乱码。
我刚刚运行 head -n 2 0 config.ini 就足以查看前 2 0 行。
无需加载整个文件,从而节省了内存。

不过,使用时一定要小心。
有一次我的同事,新来的,路径写错了,想看/var/log/syslog,结果却是/var/log。
命令直接报错说找不到文件。
所以文件路径是正确的。
还有权限。
我的另一个朋友想查看 root 的日志,但他没有足够的权限。
尾巴曾经扭曲或没有内容。
您必须考虑到这一点。

一般来说,这两个命令,尤其是tail,是记录日志所必需的。
处理大文件并快速发现问题真是一种乐趣。
尝试一下,一定会成功的。

Linux下tail命令的使用方法。

说实话,我每天都用tail,尤其是在日志的时候。
想想看,服务器日志文件很容易达到数百GB。
如果每次都要打开文本编辑器,慢慢拖动滚动条,那就变得很累了。
刚开始学习 Linux 的时候,看到 tail 的 -f 参数,我很震惊——这东西可以像 Windows 中的记事本一样自动更新,文件一变就跟着变,不用手动 Ctrl+R。

比如我上次调试Python爬虫时,日志文件实时滚动的速度非常快。
直接用tail -f access.log挂掉,没有爬取的URL就会直接显示出来,省去了我时不时打开文件看最新内容的麻烦。
有趣的是,这个命令有一个小错误,那就是,如果文件被截断或删除,-f 参数可能会卡住。
我记得不小心清除了缓存并删除了日志文件。
我无法修复尾部,所以我不得不使用kill来终止进程。
所以使用时要小心。
最好在写入文件之前挂载tail。

我也经常使用 -n 参数,特别是当我想关注最后几行时。
例如,我有一个监控脚本,将CPU温度写入temp.log中,每次服务重新启动时该文件都会被删除。
此时需要使用 tail -n 5 temp.log 确保在重新启动之前可以看到最后 5 条记录。
如果在数字前面添加 -,例如 tail -n -1 0 文件名,则表示将显示最后 1 0 行。
如果不加-,则默认显示最后1 0行。
当时我对这个细节感到困惑,并将脚本编写为 tail -n 1 0 filename 。
结果,我只看到了文件的最后 1 0 个字节,因为损坏的文件只有 1 0 个字节...
Linux 人非常聪明,他们为读取方法想出了这么多参数。
我更习惯使用 -b,例如 tail -b 1 00 filename,它将显示最后 1 00 5 1 2 字节块。
这适合读取二进制文件,或者写中文日志。
不管怎样,我尝试使用-n读取中文日志,每一行都是一串乱码,但是使用-b可以截断完整的中文句子。
当然,这东西也不是万能的。
例如,遇到emoji字符时,5 1 2 个字节可能会卡在表情中间,显示的内容可能是半张笑脸。

顺便问一下,少比多好?未成年人可以跳转到行号并直接搜索内容。
上次调试PHP代码时,在tail后面输出的错误日志中看到了“SQLSTATE[HY000]”。
使用less,您可以通过按“/”直接搜索该行。
如果使用较多,则必须手动向后滚动。
我很少用头。
我倾向于查看错误日志的最后几行。
看第一行有什么用?除非你想验证文件头是否乱码,例如运行 head -n 5 config.php 看看是否乱码。

其实这些命令的核心就是几个参数,但是它们的使用必须结合场景。
例如,如果要监视日志,请选择 -f,如果要解析文本,请选择 -n 或 -m,如果要调试二进制文件,请选择 -k。
我习惯在使用tail时加上-p参数,tail -fp filename,这样每次截断和重写文件时,tail都会显示一个日期分隔符,这样更直观。
不过这个-p只有GNU tail支持,其他系统不支持。

说到这里,我突然想起一件趣事。
尾巴有一个兄弟,叫裂口,功能完全相反。
tail是截掉最后几行,split是把大文件分割成小文件。
上次客户端的服务器即将崩溃并且日志文件太大而无法处理分析。
我使用 split -l 1 000 access.log 将其分成每 1 000 行的小文件,然后使用 less 逐页读取。
所以对于这些Linux命令兄弟来说,如果你比我强,总会有人适合你。