sed/awk/grep Cheatsheet - Linux Text Processing Reference

处理日志和文本必备的 sed/awk/grep 命令都在这里了,按匹配、替换、提取和统计分组整理,直接复制改参数。

SysOps·52 commands·Last updated 2026-07-21
Back to SysOps

grep 匹配与搜索 10

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 替换与编辑 9

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 提取与统计 9

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 4

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
一次删除注释行和空行(多条命令用分号)

sort / uniq / comm 排序去重与对比 10

sort file.txt
对文件内容排序(默认按字典序)
sort -n file.txt
按数值大小排序
sort -r file.txt
逆序排序
sort -t: -k3 -n /etc/passwd
按冒号分隔的第 3 列数值排序
sort -u file.txt
排序并去重
sort file.txt | uniq -c | sort -rn | head
经典组合:统计各行频率 TOP
uniq -c file.txt
统计每行重复次数(需先 sort)
uniq -d file.txt
只显示重复的行
comm file1 file2
比较两个已排序文件,三列:仅 file1/仅 file2/共有
diff -u file1 file2
统一格式比较文件差异

cut / tr / paste 列与字符处理 10

cut -d: -f1 /etc/passwd
按冒号分隔提取第 1 列
cut -c1-10 file.txt
按字符位置截取第 1-10 个字符
cut -f1,3 file.txt
提取第 1 和第 3 列(默认 Tab 分隔)
tr 'a-z' 'A-Z' < file.txt
小写转大写
tr -d ' \t' < file.txt
删除所有空格和 Tab
tr -s '\n' < file.txt
压缩连续空行为单个换行
paste file1.txt file2.txt
按列合并两个文件(默认 Tab 分隔)
column -t file.txt
将内容对齐为表格格式输出
expand file.txt
将 Tab 转换为空格
command | tee output.txt
同时输出到屏幕和文件(常用于管道)

💡 Tips

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