跳到主要内容
约 7 分钟2 张卡

Linux 常用命令与文件权限

运维和 SRE 面试几乎都会问“说几个常用的 Linux 命令”,接着让你现场写一条命令完成具体任务,例如从日志中统计访问最多的 IP。回答时按用途分组,并能把命令组合成管道,比罗列命令名更有说服力。本文整理按用途分组的常用命令、文本处理三件套 grep、sed、awk,以及文件权限模型。

1. 面试核心​

先记住这几条,再读正文
  • 常用命令按用途回答:文件与查找、文本处理、进程、资源、网络、磁盘。每组说出一两个最常用的,并说明各自解决什么问题。
  • grep 按模式过滤行,sed 按行编辑和替换,awk 按字段处理和统计。日志统计的典型写法是 awk 取字段 → sort → uniq -c → sort -nr → head。卡 · grep、sed 与 awk
  • 权限分为属主、属组、其他人三组,每组有读、写、执行三位,用数字表示为 r=4、w=2、x=1。目录的 x 表示能否进入和穿过,r 表示能否列出内容;访问深层文件需要路径上每一级目录都有 x。卡 · 文件权限
  • 多个用户共享文件时,用组授权:把用户加入同一个组,文件属组设为该组并给组写权限;需要更细粒度时用 ACL。不要直接给 777 或把用户加入 root 组。

2. 按用途分组的常用命令​

用途命令典型用法
文件与查找ls、find、ln、tarfind /var/log -name "*.log" -mtime +7 -size +100M 查找 7 天前、大于 100 MB 的日志
文本查看cat、less、head、tailtail -f app.log 跟踪日志;tail -n 200 看最后 200 行
文本处理grep、sed、awk、sort、uniq、wc、cut见下一节
进程ps、top、kill、pgrep、systemctlps -ef | grep nginx;systemctl status nginx
资源free、vmstat、iostat、uptime见 Linux 性能排查
磁盘df、du、lsof见磁盘与文件系统排查
网络ss、curl、dig、ping、tcpdumpss -lntp | grep 8080 查看哪个进程监听 8080 端口;见 Linux 网络排查
定时任务crontabcrontab -e 编辑;五个字段是分、时、日、月、周

3. grep、sed 与 awk​

grep:按正则表达式过滤行。

grep -n "ERROR" app.log # 显示行号
grep -c "ERROR" app.log # 统计匹配行数
grep -v "DEBUG" app.log # 反向过滤
grep -E "timeout|refused" app.log # 扩展正则(egrep 等价于 grep -E)
grep -rn "TODO" src/ # 递归搜索目录

sed:按行编辑,常用于替换和取指定行。

sed -n '10p' file # 打印第 10 行
sed -n '100,200p' file # 打印 100 到 200 行
sed -i 's/old/new/g' config.conf # 原地替换(先备份或用 -i.bak)

awk:把每行按分隔符拆成字段 $1、$2……,适合取列和统计。

awk 'NR==10' file # 打印第 10 行
awk -F: '{print $1}' /etc/passwd # 以 : 分隔,打印第一列
awk '$9 >= 500' access.log # 状态码大于等于 500 的请求
awk '{sum += $10} END {print sum}' access.log # 累加某一列

组合统计:Nginx 访问日志中访问次数最多的 10 个 IP。

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

uniq 只合并相邻的重复行,所以要先 sort;uniq -c 输出“次数 内容”,再按数字倒序排序。

4. 文件权限​

ls -l 的输出:

-rwxr-x--- 1 app devops 4096 Oct 13 10:00 deploy.sh
部分含义
第 1 位文件类型:- 普通文件、d 目录、l 符号链接
后 9 位属主、属组、其他人各三位权限
1硬链接数
app devops属主和属组

数字表示:r=4、w=2、x=1,三组分别相加。750 表示属主读写执行、属组读和执行、其他人无权限。

文件和目录上的含义不同:

权限文件目录
r读取内容列出目录中的文件名
w修改内容在目录中创建、删除、重命名文件(删除文件看的是目录的 w,不是文件本身的权限)
x作为程序执行进入目录、访问其中已知名称的文件

访问 /data/app/logs/a.log,路径上的 /data、/data/app、/data/app/logs 都需要 x 权限。

其他相关概念

  • umask:新建文件的默认权限掩码,常见 022,新文件为 644、新目录为 755。
  • 特殊权限:SUID 让程序以文件属主身份运行(如 passwd);SGID 用在目录上,让新文件继承目录的属组,适合共享目录;Sticky 位用在 /tmp 这类目录上,只有文件属主能删除自己的文件。
  • 软链接是一个指向路径的独立文件,可以跨文件系统、可以指向目录,目标删除后失效;硬链接是同一个 inode 的另一个名字,不能跨文件系统,删除其中一个名字不影响数据。
  • 权限正确但仍无法访问时,检查 ACL(getfacl)、SELinux、文件系统是否以只读或 noexec 挂载。

5 · 面试题卡片​

5.1 怎样用 grep、awk 等命令统计日志?例如找出访问次数最多的 10 个 IP、打印文件第 10 行。​

出现公司:蚂蚁金服、美团、百度、虾皮、携程

考察重点

  • grep、sed、awk 的分工。
  • 用管道组合出统计命令,并解释 sort 必须在 uniq 之前。

相关内容:grep、sed 与 awk、按用途分组的常用命令。

参考回答

grep 按正则过滤行,-n 显示行号、-c 计数、-v 反向、-E 使用扩展正则(等同于 egrep);sed 按行编辑,sed -n '10p' 打印第 10 行,sed -i 's/a/b/g' 原地替换;awk 把每行拆成字段处理,适合取列、过滤和统计,awk 'NR==10' 也能打印第 10 行。

统计访问最多的 IP:awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10。先用 awk 取出 IP 列,sort 让相同的 IP 相邻,uniq -c 合并并计数(它只能合并相邻行),再按次数倒序取前 10。查找某个字符串在哪一行用 grep -n "aaaa" file。日志很大时可以先用 grep 缩小范围,或者用 awk 一次完成计数:awk '{c[$1]++} END {for (ip in c) print c[ip], ip}' access.log | sort -nr | head。

5.2 ls -l 的每一列是什么意思?目录的读、写、执行权限分别代表什么?两个用户都要操作同一个文件,应该怎样授权?​

出现公司:京东、美团、共济科技、持安科技

考察重点

  • 三组九位权限和数字表示。
  • 文件与目录上 r、w、x 的不同含义;删除文件取决于目录的 w。
  • 用组或 ACL 授权,而不是放宽到所有人。

相关内容:文件权限。

参考回答

ls -l 依次显示文件类型和权限、硬链接数、属主、属组、大小、修改时间和文件名。权限分为属主、属组、其他人三组,每组 r、w、x,用数字表示时 r=4、w=2、x=1,例如 755 表示属主可读写执行、其他人可读和执行。

目录上的含义与文件不同:r 允许列出目录中的文件名,w 允许在目录中创建、删除和重命名文件,x 允许进入目录并访问其中的文件。所以删除一个文件看的是所在目录的 w;访问深层文件需要路径上每一级目录都有 x。对文件做读写需要文件本身的 r、w。

两个用户共同操作一个文件:建一个组,把两个用户加入该组,把文件(或所在目录)的属组改成这个组并给组读写权限;共享目录可以设置 SGID,让新文件自动继承属组。需要给个别用户单独授权时用 ACL(setfacl -m u:alice:rw file)。不应该用 777 或把用户加入 root 组。

6. 参考资料​