常用 Linux 命令详解

常用 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///gg 是"全局",不加只替换每行第一处


五、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}'