跳到主要内容

常用命令速查

问题

请整理 Linux 运维中最常用的命令,覆盖文件操作、文本处理、系统信息、网络等场景。

答案

文件与目录操作

# 查找文件
find /var/log -name "*.log" -mtime -7 # 最近 7 天修改的 log 文件
find / -size +100M -type f # 大于 100MB 的文件
find /tmp -mtime +30 -delete # 删除 30 天前的文件
find . -name "*.bak" -exec rm {} \; # 删除所有 .bak
find . -type f -name "*.conf" -exec grep -l "error" {} \; # 搜索文件内容

# 文件操作
cp -a source dest # 保留所有属性复制(归档模式)
rsync -avz src/ dest/ # 增量同步(推荐替代 cp)
tar -czf backup.tar.gz /opt/app # 压缩
tar -xzf backup.tar.gz -C /opt/ # 解压
ln -s /opt/app/current /opt/app/v2 # 创建软链接

# 磁盘空间
df -hT # 文件系统使用情况(含类型)
du -sh /var/log/* # 各子目录大小
du -sh * | sort -rh | head -20 # 当前目录 Top 20 大文件/目录
ncdu /var # 交互式磁盘分析(需安装)

文本处理

# 查看文件
cat file.txt # 查看全部内容
head -20 file.txt # 前 20 行
tail -20 file.txt # 后 20 行
tail -f /var/log/syslog # 实时跟踪(-f follow)
tail -f log.txt | grep --line-buffered "error" # 实时过滤
less file.txt # 分页查看(支持搜索 /keyword)

# 文本统计
wc -l file.txt # 行数
wc -w file.txt # 单词数

# 排序去重
sort file.txt # 排序
sort -u file.txt # 排序并去重
sort -t: -k3 -n /etc/passwd # 按第 3 列数字排序
uniq -c # 去重并计数(需先 sort)

# xargs - 将输入转为命令参数
find /tmp -name "*.tmp" | xargs rm -f
cat servers.txt | xargs -I{} ssh {} "uptime"
echo "1 2 3 4 5" | xargs -n2 # 每次传 2 个参数

# 管道组合实战
# 统计每个 HTTP 状态码的数量
awk '{print $9}' access.log | sort | uniq -c | sort -rn

# 找出占用空间最大的 10 个目录
du -h --max-depth=1 / 2>/dev/null | sort -rh | head -10

# 查找最近修改的文件
find /opt/app -type f -mmin -60 -printf '%T+ %p\n' | sort -r | head -20

系统信息

# 系统基本信息
uname -a # 内核版本
hostnamectl # 主机名、OS、架构
cat /etc/os-release # 发行版信息
uptime # 运行时间和负载

# CPU
lscpu # CPU 架构信息
nproc # CPU 核心数
cat /proc/cpuinfo | grep "model name" | head -1

# 内存
free -h # 内存使用
cat /proc/meminfo # 详细内存信息

# 磁盘
lsblk # 块设备列表
fdisk -l # 分区信息
blkid # 设备 UUID

# 网络
ip addr # IP 地址
ip route # 路由表
ss -tlnp # 监听端口
cat /etc/resolv.conf # DNS 配置

网络诊断

# 连通性测试
ping -c 4 8.8.8.8 # 基础连通性
traceroute 8.8.8.8 # 路由追踪
mtr 8.8.8.8 # 综合诊断(ping + traceroute)

# DNS 查询
dig example.com # DNS 查询
dig @8.8.8.8 example.com # 指定 DNS 服务器
nslookup example.com

# 端口与连接
ss -tlnp # TCP 监听端口
ss -s # 连接统计
ss -tn state established # 已建立的连接

# HTTP 测试
curl -I https://example.com # 只显示 HTTP 头
curl -o /dev/null -s -w "%{http_code} %{time_total}s\n" URL # 状态码+耗时
curl -X POST -d '{"key":"val"}' -H "Content-Type: application/json" URL

# 抓包
tcpdump -i eth0 port 80 -nn # 抓 80 端口
tcpdump -i eth0 host 192.168.1.100 # 抓指定 IP
tcpdump -i any -w capture.pcap # 保存为文件

用户与权限

# 用户管理
useradd -m -s /bin/bash user # 创建用户
usermod -aG docker user # 加入组
passwd user # 设置密码
id user # 查看用户信息

# 权限管理
chmod 755 script.sh
chown -R app:app /opt/app

进程管理

# 查看进程
ps aux --sort=-%cpu | head -20 # 按 CPU 排序
ps aux --sort=-%mem | head -20 # 按内存排序
pgrep -la nginx # 按名称查找

# 杀死进程
kill -TERM <PID> # 优雅终止
kill -9 <PID> # 强制杀死
pkill -f "pattern" # 按模式杀死

# 系统资源
top / htop # 实时监控
vmstat 1 5 # 系统统计
iostat -xz 1 5 # I/O 统计
sar -n DEV 1 5 # 网络统计

日志查看

# systemd 日志
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx -f # 实时跟踪
journalctl --disk-usage # 日志占用

# 系统日志
tail -f /var/log/syslog # Debian/Ubuntu
tail -f /var/log/messages # CentOS/RHEL
tail -f /var/log/auth.log # 认证日志
tail -f /var/log/secure # CentOS 认证日志

# 日志分析
grep -c "error" /var/log/app.log # 错误数量
grep "error" /var/log/app.log | tail -20 # 最近 20 条错误
zgrep "error" /var/log/app.log.*.gz # 搜索压缩日志

软件包管理

# Debian/Ubuntu (apt)
apt update && apt upgrade -y
apt install nginx
apt remove nginx
apt search keyword
dpkg -l | grep nginx

# CentOS/RHEL (yum/dnf)
yum update -y
yum install nginx
yum remove nginx
yum search keyword
rpm -qa | grep nginx

常见面试问题

Q1: 如何快速定位占用磁盘空间最大的文件?

答案

# 方法 1:du + sort
du -ah / --max-depth=2 2>/dev/null | sort -rh | head -20

# 方法 2:find 大文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh

# 方法 3:ncdu 交互式
ncdu /

Q2: 如何实时监控日志中的关键字?

答案

# 方法 1:tail + grep
tail -f /var/log/app.log | grep --line-buffered "error\|warning"

# 方法 2:多文件监控
tail -f /var/log/nginx/access.log /var/log/nginx/error.log

# 方法 3:journalctl
journalctl -u myapp -f --grep="error"

Q3: xargs 是干什么的?给个实际例子。

答案

xargs 将标准输入转为命令参数。常与 find、管道配合:

# 删除 30 天前的日志
find /var/log -name "*.log" -mtime +30 | xargs rm -f

# 批量重启服务
echo "nginx redis mysql" | xargs -n1 systemctl restart

# 并行处理(-P 参数)
cat hosts.txt | xargs -P4 -I{} ssh {} "uptime"

Q4: 怎么在不重启服务的情况下清空日志文件?

答案

# 正确方式:truncate(保持 inode 不变,进程仍然可以写入)
truncate -s 0 /var/log/app.log
# 或
> /var/log/app.log
# 或
cat /dev/null > /var/log/app.log

# 错误方式:rm + touch(进程持有旧文件描述符,空间不会释放)
# rm /var/log/app.log # ❌ 不推荐

关键区别:truncate 保持文件的 inode 不变,进程的文件描述符仍然有效。rm 删除目录条目但进程仍持有旧 inode,磁盘空间不会释放直到进程关闭文件。

相关链接