linux Cheatsheet

sed / awk / grep 文本处理速查表

Linux 文本三剑客 sed、awk、grep 常用命令一页速查:正则匹配、替换、提取列、统计和批量处理等 30+ 高频操作,含关键参数说明与典型排障场景示例。

把 sed/awk/grep 日常最常敲的命令按匹配、替换、提取和统计分组整理,日志分析和批量处理直接复制改参数即可。

sedawkgrep文本处理正则

grep 匹配与搜索

  • grep "error" app.log
    查找包含 error 的行
  • grep -i "error" app.log
    忽略大小写匹配
  • grep -rn "TODO" src/
    递归搜索目录,显示文件名和行号
  • grep -v "debug" app.log
    反向匹配,排除含 debug 的行
  • grep -c "error" app.log
    统计匹配行数
  • grep -E "error|warning" app.log
    扩展正则,等价于 egrep
  • grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log
    只输出匹配的 IP 地址部分
  • grep -A 3 "error" app.log
    匹配行后再显示 3 行上下文
  • grep -B 2 "error" app.log
    匹配行前显示 2 行上下文
  • grep -f pattern.txt app.log
    从文件读取多个模式

sed 替换与编辑

  • sed 's/old/new/g' file.txt
    全局替换 old 为 new
  • sed -i 's/old/new/g' file.txt
    直接修改文件(原地编辑)
  • sed -i.bak 's/old/new/g' file.txt
    修改文件并备份原文件为 .bak
  • sed '5d' file.txt
    删除第 5 行
  • sed '/^#/d' file.conf
    删除所有以 # 开头的注释行
  • sed '/^$/d' file.txt
    删除空行
  • sed -n '10,20p' file.txt
    只打印第 10-20 行
  • sed 's/[[:space:]]*$//' file.txt
    删除行尾空格
  • sed -E 's/([0-9]+)/\1/' file.txt
    扩展正则捕获组,-E 等价于 -r

awk 提取与统计

  • awk '{print $1}' access.log
    打印第一列(默认空格分隔)
  • awk -F: '{print $1, $3}' /etc/passwd
    指定冒号分隔,打印用户名和 UID
  • awk 'NR==10' file.txt
    打印第 10 行(NR=行号)
  • awk 'NR>=10 && NR<=20' file.txt
    打印第 10-20 行
  • awk '{sum += $1} END {print sum}' nums.txt
    对第一列求和
  • awk '{count[$1]++} END {for(k in count) print k, count[k]}' access.log
    按第一列分组统计出现次数
  • awk '$3 > 100' data.txt
    打印第三列大于 100 的行
  • awk 'length > 80' file.txt
    打印长度超过 80 的行
  • awk -F: '$3 >= 1000 {print $1}' /etc/passwd
    列出 UID >= 1000 的普通用户

组合管道 Pipeline

  • grep "error" app.log | awk "{print \$1}" | sort | uniq -c | sort -rn | head
    统计 error 日志中每个时间戳出现次数 TOP
  • cat access.log | awk "{print \$1}" | sort | uniq -c | sort -rn | head -20
    统计访问量 TOP 20 的 IP
  • grep -oE "[0-9]+ms" app.log | sort -rn | head -10
    提取响应耗时 TOP 10
  • sed '/^#/d; /^$/d' nginx.conf
    一次删除注释行和空行(多条命令用分号)

容易踩的坑

  • sed -i 直接修改文件前先备份(-i.bak),或先不加 -i 预览结果再写入。
  • grep 处理大文件加 --line-buffered 让输出实时刷新,否则管道下游会等缓冲满。
  • awk 单引号内用 $1 取列,双引号内要转义为 \$1,否则 shell 会解释。