常用 Linux 命令详解
挑几条你日常最可能用到的,讲透用法和"什么时候用"。
一、find — 按条件找文件
核心:按名字、时间、大小、权限、类型找文件,还能对结果执行命令。
# 按名字(不区分大小写)
find /path -iname "*.log"
# 按修改时间:7 天内
find /path -mtime -7
# 按大小:大于 100M
find /path -size +100M
# 组合:找 .py 文件并删除(危险,先看再删)
find /path -name "*.py" -type f # 先列出
find /path -name "*.py" -type f -delete # 再删
# 对结果执行命令(-exec,{} 是占位符,\; 结束)
find /path -name "*.log" -exec gzip {} \;
# 更高效:+ 代替 \;,批量传给命令
find /path -name "*.log" -exec rm {} +
关键点:
-
-mtime -7= 7 天内修改过;+7= 7 天前修改过 -
-exec ... {} +比\;快(一次传多个文件) -
删之前先跑一遍不带
-delete的,确认结果对
二、grep — 搜文本内容
核心:在文件里搜字符串,支持正则。
# 基本搜索
grep "error" app.log
# 递归搜目录
grep -r "TODO" ./src
# 显示行号 + 文件名
grep -rn "error" ./logs
# 不区分大小写
grep -i "error" app.log
# 反向:不含 error 的行
grep -v "error" app.log
# 正则(-E 扩展正则)
grep -E "error|warning" app.log
# 搜二进制文件(编译型程序里找特征串)
grep -a "Reply exactly" ./binary
你踩过的坑(来自 wxwatcher 排查日志):
-
grep -I(大写 i)会跳过二进制——搜编译型程序要带-a/--text -
zsh 里
grep -r "*.py"会被 glob 展开报错——用--include='*.py'或加引号
grep -rn --include="*.py" "def main" ./src
三、awk — 按列处理文本
核心:把每行按分隔符切成列,按列筛选、计算、格式化。
# 打印第 1、3 列(默认空格分隔)
awk '{print $1, $3}' file.txt
# 指定分隔符(逗号)
awk -F',' '{print $1, $2}' data.csv
# 按条件筛选(第 2 列 > 100)
awk '$2 > 100 {print $0}' data.txt
# 求和(第 3 列)
awk '{sum += $3} END {print sum}' data.txt
# 统计去重(第 1 列出现的次数)
awk '{count[$1]++} END {for (k in count) print k, count[k]}' file.txt
# 打印行号 + 内容
awk '{print NR": "$0}' file.txt
典型场景:日志分析、CSV 处理、字段提取。
# 从 access.log 提取访问量 top 10 的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
四、sed — 流式替换/编辑
核心:不改原文件,对文本流做替换、删除、插入。
# 替换(只输出,不改原文件)
sed 's/old/new/' file.txt
# 全局替换(g)
sed 's/old/new/g' file.txt
# 直接改文件(-i,macOS 要加 '')
sed -i '' 's/old/new/g' file.txt # macOS
sed -i 's/old/new/g' file.txt # Linux
# 删除空行
sed '/^$/d' file.txt
# 删除含某字符串的行
sed '/debug/d' file.txt
# 只打印第 10-20 行
sed -n '10,20p' file.txt
# 正则替换(用 & 保留匹配内容)
sed 's/error/【&】/g' file.txt # 给 error 加括号
关键点:
-
macOS 的
sed -i必须跟一个参数(-i ''),Linux 不用——这是跨平台最常见的坑 -
s///g的g是"全局",不加只替换每行第一处
五、xargs — 把输出变成参数
核心:把"一行行输出"变成"命令的参数",常和 find/grep 配合。
# 把 find 结果传给 rm
find /path -name "*.tmp" | xargs rm
# 处理含空格的文件名(-0 + find -print0)
find /path -name "*.tmp" -print0 | xargs -0 rm
# 每条命令最多传 N 个参数
find . -name "*.log" | xargs -n 1 gzip
# 用 -I 占位符,灵活嵌入
cat urls.txt | xargs -I {} curl -O {}
# 并行执行(-P,加速大批量处理)
find . -name "*.jpg" | xargs -P 8 -I {} convert {} -resize 50% {}
关键点:
-
文件名含空格时,必须
-print0+xargs -0——否则会被拆成多个参数 -
-P 8= 8 个并行进程,批量任务提速利器
六、ss / lsof — 看端口和连接
核心:查"谁在监听哪个端口""谁连着谁"。
# 看监听端口(-t TCP,-n 数字,-p 显示进程)
ss -tlnp
# 看某端口的连接
ss -tnp | grep :8082
# lsof:看端口被谁占用
lsof -nP -i :8082
# 看某进程打开的文件
lsof -p <pid>
# 看某文件被谁占用
lsof /path/to/file
你排查时的实际用法(ZOLTRAAK 事件):
# 1 秒轮询,抓客户端 PID
while :; do lsof -nP -i TCP:8082 | grep -v LISTEN; sleep 1; done
七、tcpdump — 抓包
核心:抓网络流量,看请求明文。
# 抓某端口(-A ASCII 模式,直接看 HTTP 明文)
tcpdump -i any -n -s0 -A -l "tcp port 8082"
# 抓某 IP
tcpdump -i any -n host 31.77.203.199
# 抓回环(本机内部通信)
tcpdump -i lo -n -s0 -A -l "tcp port 9090"
# 存文件,事后用 wireshark 分析
tcpdump -i any -w capture.pcap "tcp port 80"
你踩过的坑:
-
SSH 会话结束会杀后台 tcpdump——用
setsid脱离:setsid sh -c "tcpdump ... > /tmp/p.txt 2>&1" < /dev/null > /dev/null 2>&1 & -
pkill -f tcpdump会杀掉自己(命令行本身含 "tcpdump" 字符串)——改按进程名精确匹配
八、systemctl — 服务管理
核心:管理 systemd 服务(启动/停止/看状态/看日志)。
systemctl status sshd # 看状态
systemctl start/stop/restart # 启停重启
systemctl reload nginx # 热重载(不改进程)
systemctl enable/disable # 开机自启
systemctl list-units --failed # 看哪些服务挂了
# 看日志(最常用)
journalctl -u sshd -f # 实时跟踪
journalctl -u sshd --since "1 hour ago"
journalctl -u sshd -n 100 # 最近 100 行
九、chmod / chown — 权限
# 数字法:4=读 2=写 1=执行
chmod 755 script.sh # rwxr-xr-x
chmod 644 file.txt # rw-r--r--
chmod 600 key.txt # rw-------(私钥用这个)
# 符号法
chmod +x script.sh # 加执行
chmod -R 755 dir/ # 递归
# 改属主
chown user:group file
chown -R user:group dir/
关键点:私钥、密钥文件一律 600——你 ZOLTRAAK 那份 api网关密钥.txt 就是 0600,这是对的。
十、df / du — 磁盘
df -h # 各分区使用率
df -h /path # 某路径所在分区
du -sh /path # 目录总大小
du -sh * | sort -rh # 当前目录下各项大小,降序
du -h --max-depth=1 /path # 一层层看
排查磁盘满的标准动作:
df -h # 先看哪个分区满
du -sh /* 2>/dev/null | sort -rh | head # 逐层定位
组合技:几个实用管道
# 1. 找最大的 10 个文件
find / -type f -size +100M 2>/dev/null | xargs du -sh | sort -rh | head
# 2. 统计日志里 top 10 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head
# 3. 批量替换目录下所有文件的字符串
grep -rl "old" ./src | xargs sed -i 's/old/new/g'
# 4. 实时看某进程日志里的错误
tail -f app.log | grep --line-buffered "ERROR"
# 5. 找出监听端口对应的进程
ss -tlnp | awk 'NR>1 {print $4, $6}'