服务器上有几十万个文件、几百万行日志。能不能快速找到你要的那个,是效率的分水岭。
$ find /etc -name "*.conf" | head
$ sudo find /var/log -mtime -1 # 一天内改过的
$ sudo grep -i error /var/log/messages | tail -20
$ grep -rn "listen" /etc/nginx/ # -r 递归 -n 行号
$ sudo du -sh /var/log/* | sort -rh | head -5
先分清这两个
- find
- 按文件本身的属性找:名字、大小、修改时间、类型、属主。不关心文件里写了什么。
- grep
- 按文件里的内容找:哪一行包含某个关键词。不关心文件叫什么名。
- 怎么记
- 「这台机器上 nginx 的配置文件在哪」→ find。
「配置里监听端口那行写的啥」→ grep。
find
基本格式是 find 路径 条件。路径必须放在条件前面,顺序写反了会报错——这是最常见的入门错误。
$ find /etc -name "*.conf" # 所有 .conf 结尾的
$ find /etc -name "nginx*" # nginx 开头的
$ find / -name "nginx.conf" 2>/dev/null
↑ 全盘找。2>/dev/null 是把「权限不足」的报错扔掉,屏幕清爽
名字带 * 时一定要加引号。不加的话通配符会被 shell 先展开,find 收到的就不是你想的东西了。
按时间找 —— 排障最常用,也最容易搞错
- -mtime -1
- 1 天以内修改的(最近 24 小时)。排障时用这个——「今天有谁动过什么」。
- -mtime +7
- 7 天以前修改的(超过 7 天没动过)。清理老文件用这个。
- -mtime 1
- 不带正负号,指的是正好第 1 天那一天(24~48 小时前)。这个用得少,但要知道它不等于「一天内」。
- -mmin -30
- 按分钟算,30 分钟内改过的。刚出故障时比按天更精确。
记住这个就不会错:- 往近了数,+ 往远了数。
第 25 天清理老日志的定时任务,用的就是 -mtime +7。
其他常用条件
$ find /etc -type f # f=文件 d=目录 l=链接
$ find /var/log -size +100M # 大于 100M 的(找大文件)
$ find /home -user devops # 属于某个用户的
$ find /tmp -type f -name "*.log" -mtime +7
↑ 条件可以叠加,默认是「而且」的关系
-delete 和 -exec
find 不只能列出来,还能直接对找到的文件动手。这也是它最危险的地方。
# 删掉 7 天前的日志
$ sudo find /var/log -name "*.log" -mtime +7 -delete
# 对每个结果执行命令,{} 是找到的文件,\; 是结束符
$ find /tmp -name "*.tmp" -exec ls -lh {} \;
加 -delete 之前,先不加跑一遍,看清楚列出来的到底是哪些文件,确认无误再删。
find 配 -delete 是运维事故的常见来源——条件写错一点,删掉的范围可能天差地别。
grep
Day 03 已经用它过滤日志了,今天系统地过一遍参数。
- -i
- 忽略大小写。日志里
Error、ERROR、error都有,基本上要一直带着它。 - -r
- 递归搜索整个目录。「这个配置项到底写在哪个文件里」就靠它。
- -n
- 显示行号。配合 vim 的
:47直接跳过去改。 - -v
- 反向——显示不包含关键词的行。用来排除干扰。
- -c
- 只数个数,不显示内容。「今天报了多少次错」。
- -A5 / -B5 / -C5
- 显示匹配行的后 5 行 / 前 5 行 / 前后各 5 行。看上下文。
# 1. 这个配置项写在哪个文件里?
$ grep -rn "listen" /etc/nginx/
/etc/nginx/nginx.conf:47: listen 80;
# 2. 看配置但不看注释和空行(-v 排除)
$ grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"
# 3. 谁在爆破 SSH
$ sudo grep "Failed password" /var/log/secure | tail -20
# 4. 数一下爆破了多少次
$ sudo grep -c "Failed password" /var/log/secure
grep -v "^#" | grep -v "^$" 的意思是「去掉注释行,再去掉空行」。^ 表示行首。
很多配置文件几百行,其中九成是注释。用这招一过滤,真正生效的配置可能就十几行——一眼就看明白了。这是看陌生服务器配置时的第一个动作。
串起来用
Day 01 讲了管道,今天把它和这两个命令组合起来,就是运维的日常火力:
# 磁盘满了:找出 /var/log 下最占空间的 5 个
$ sudo du -sh /var/log/* | sort -rh | head -5
# 今天有谁动过 /etc 下的配置
$ sudo find /etc -type f -mtime -1 -exec ls -lt {} \; 2>/dev/null
# 全盘找大于 500M 的文件
$ sudo find / -type f -size +500M 2>/dev/null | head
# 统计哪个 IP 爆破得最凶
$ sudo grep "Failed password" /var/log/secure \
| awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
最后那条现在看不懂没关系——awk、sort、uniq 第 27 天会讲。先感受一下:几个小命令串起来,就能做出很像样的统计。
第一周,你已经会了这些
- Day 01
- 认地形:
/etc配置、/var/log日志,读懂ls -l的每一列,管道的概念。 - Day 02
- 动手改:增删改查,改配置前先备份,绝对路径与相对路径。
- Day 03
- 看日志:
tail -f实时跟踪,两个窗口的排障姿势,grep -A -B看上下文。 - Day 04
- 改文件:vim 的模式概念,三招保命,
:set nu配合报错行号。 - Day 05
- 找东西:
find按属性、grep按内容,串成管道。
不是记住了多少命令,而是你现在能独立完成一次「查问题 → 改配置 → 验证」的完整动作了。
下周开始讲权限和用户——那是运维面试出现频率最高的部分。
今天的面试点
grep -i error 配合 tail 缩小范围,再用 grep -A5 -B5 看上下文。
加一句更好:「如果日志太大,我会先 grep -c 数一下量级,再决定是精确过滤还是直接看时间段。」
「df -h 先定位是哪个分区,然后 du -sh /目录/* | sort -rh | head 逐层往下找,或者 find / -size +500M 直接找大文件。」
这题第 21 天还会展开讲,那时候你会知道一个更能加分的答法。
今天的练习
find /etc -name "*.conf" | wc -l,数数你这台机器有多少个 .conf 文件sudo find /etc -type f -mtime -1,看看今天有哪些配置被动过(刚装完系统,应该能看到不少)- 重点:
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$",看看去掉注释后真正生效的配置有几行 sudo grep -c "Failed password" /var/log/secure,看看有没有人试过爆破你的机器sudo du -sh /var/log/* | sort -rh | head -5,找出最占空间的日志- 用
grep -rn在/etc里搜一个你认识的关键词(比如Port),体会-r和行号的作用
Week 02 讲权限和用户——rwx、755、属主属组、sudo。这是运维面试出现频率最高的一块,没有之一。
Day 01 学 ls -l 时看到的那十个字符,下周会彻底讲透。