这是一个续篇。上一篇文章里我把 Linux 基础指令里最常用的目录跳转、文件创建、复制删除那些过了一遍,发文之后不少人催第二篇。我翻了一下自己各个服务器的操作历史,发现真正值得单独拿出来写一批的,其实是“每天都在用、但很少有人讲清楚原理”的那批指令。所以这一篇我打算围绕文件内容查看与搜索、权限与用户管理、压缩打包、进程与系统状态排查几条线展开,目标读者和上篇一样,既包括刚接触 Linux 的同学,也包括想把手头服务器操作从“背命令”变成“懂套路”的人。看完之后你会发现,每条指令单拆出来都不难,真正拉开效率差距的是组合方式和判断顺序。
1. 文件内容查看与检索:cat、less、tail、grep 怎么搭配才省事
1.1 cat 只是“轻量查看器”,大文件别硬扛
cat 是大多数人最先接触的看文件命令,但它真的不是万能工具。小文件比如 /etc/hosts、/etc/resolv.conf 这种几行、几十行的配置,直接 cat 一眼看全没问题。可一旦文件变成几十上百 MB 的日志或者数据文件,cat 的短板就非常明显:它的输出方式是“把整个文件往终端倒”,屏幕上会连续刷出几十屏内容,终端直接卡一下都算轻的,最要命的是你想回头找前面的内容几乎不可能,只能往上滚半天。处理这种情况,正确做法是看文件大小再决定工具,我自己的习惯有这几条:文件只有几十行,用 cat -n 带行号看;文件几百行以上,用 less;只想看头部或者尾部,用 head、tail;想按关键字过滤,直接 grep。
cat -n 显示行号这个功能经常被忽略,但排查配置文件和脚本时价值很高。比如某个 Python 服务报错“Cannot open include file: xxx”,你用 grep -n 在配置里先定位,再用 sed -n '20,30p' 把指定区间打出来,比从头到尾翻快太多。顺便提一句,cat 还有两个小参数:-b 只给非空行编号,-s 合并连续空行。最关键的一点是别把 cat 当成所有文件查看问题的统一解,它是“轻量查看器”,不是“文件阅读器”。另外提醒一下,如果手滑 cat 了一个二进制文件,比如 ELF 可执行程序或者 .so 动态库,终端里会冒出一堆乱码,严重时还会影响当前 shell 的显示,不用慌,直接执行 reset 就能恢复终端。
1.2 tail -f 和 grep 组合,是日志排查的黄金操作
日志场景里最常用的其实不是 cat,而是 tail -f。-f 表示 follow,持续输出文件里新增的内容,调试正在运行的 web 服务时几乎是标配操作。我经常像下面这样组合使用:
bash复制tail -f /var/log/nginx/access.log | grep -v "HTTP/1.1\" 200"
这条命令的意思是实时看访问日志,但把状态码为 200 的正常请求过滤掉,剩下的基本都是异常流量、错误请求或者需要关注的接口调用。如果你要同时盯多个状态码,用 grep -E "500|502|503";要排除多个无关关键字,用 grep -v -e "OPTIONS" -e "GET /favicon"。这套组合在排查 nginx 或后端服务的时候特别好用。
和 tail 相对的是 less。很多人以为 less 就是 more 的升级版,实际上两者差别很大。less 支持上下方向键逐行滚动,支持 PageUp/PageDown 翻页,支持 / 关键字向下搜索、? 向上搜索,还能按 g 跳到首行、按 G 跳到尾行。打开一个几百 MB 的日志文件,less 不会把整个文件一次性读进内存,它是按需加载的,所以操作起来非常顺滑。我习惯在 less 里加 -N 打开行号,排查配置问题时可以直接说“第 210 行有语法错误”,而不是让对方从头找。
1.3 grep 搜目录内容时,-r、-i、-l 三个开关要记牢
grep 不只是配合 tail 用,它本身就能对目录做全文检索。比如改了多个配置文件,不确定还有哪些地方引用了某个绝对路径,可以用 grep -rl "/data/app" /etc 列出所有出现该字符串的文件名。-l 只输出文件名,不会把整段匹配内容都倒出来,结果干净得多。搜索代码目录时我会再加一层过滤:grep -r --include="*.py" "def main" /opt/project/,把范围限定到 Python 文件;需要忽略大小写就加 -i,比如搜 error 时连 error、Error、ERROR 一起命中。
这里有个容易忽略的细节:gre
