文本处理 #
sed - 流编辑器 #
基本用法 #
bash
# 替换第一个匹配
$ sed 's/old/new/' file.txt
# 替换所有匹配
$ sed 's/old/new/g' file.txt
# 只打印修改的行
$ sed -n 's/old/new/p' file.txt
# 直接修改文件
$ sed -i 's/old/new/g' file.txt
替换操作 #
bash
# s 命令替换
$ sed 's/old/new/' file.txt # 替换每行第一个
$ sed 's/old/new/g' file.txt # 替换每行所有
$ sed 's/old/new/2' file.txt # 替换每行第二个
$ sed 's/old/new/gi' file.txt # 忽略大小写
# 使用不同的分隔符
$ sed 's|/usr/local|/usr|g' file.txt
$ sed 's#/usr/local#/usr#g' file.txt
# 使用正则表达式
$ sed 's/[0-9]\+/NUMBER/g' file.txt
$ sed 's/^#//' file.txt # 删除行首 #
$ sed 's/$/ END/' file.txt # 行尾添加
# 使用 & 引用匹配内容
$ sed 's/[0-9]\+/[&]/g' file.txt # 数字加方括号
# 使用分组
$ sed 's/\([a-z]\+\) \([a-z]\+\)/\2 \1/' file.txt
行操作 #
bash
# 打印行
$ sed -n '10p' file.txt # 打印第 10 行
$ sed -n '10,20p' file.txt # 打印 10-20 行
$ sed -n '10,$p' file.txt # 打印 10 行到末尾
$ sed -n '/pattern/p' file.txt # 打印匹配行
# 删除行
$ sed '10d' file.txt # 删除第 10 行
$ sed '10,20d' file.txt # 删除 10-20 行
$ sed '/pattern/d' file.txt # 删除匹配行
$ sed '/^$/d' file.txt # 删除空行
$ sed '/^#/d' file.txt # 删除注释行
# 插入和追加
$ sed '10i\new line' file.txt # 第 10 行前插入
$ sed '10a\new line' file.txt # 第 10 行后追加
$ sed '$a\new line' file.txt # 末尾追加
# 替换整行
$ sed '10c\new line' file.txt # 替换第 10 行
$ sed '/pattern/c\new line' file.txt
常用选项 #
bash
# -i 直接修改文件
$ sed -i 's/old/new/g' file.txt
# -i.bak 修改前备份
$ sed -i.bak 's/old/new/g' file.txt
# -e 多个命令
$ sed -e 's/old/new/g' -e 's/foo/bar/g' file.txt
# -f 从文件读取命令
$ sed -f script.sed file.txt
# -n 只打印指定内容
$ sed -n '10,20p' file.txt
实用示例 #
bash
# 删除 HTML 标签
$ sed 's/<[^>]*>//g' file.html
# 删除行首空格
$ sed 's/^[ \t]*//' file.txt
# 删除行尾空格
$ sed 's/[ \t]*$//' file.txt
# 删除空行
$ sed '/^$/d' file.txt
# 添加行号
$ sed '=' file.txt | sed 'N;s/\n/ /'
# 提取 IP 地址
$ sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' file.txt
# 配置文件修改
$ sed -i 's/^DEBUG=.*/DEBUG=false/' config.ini
awk - 文本处理语言 #
基本用法 #
bash
# 打印整行
$ awk '{print}' file.txt
# 打印指定列
$ awk '{print $1}' file.txt # 第一列
$ awk '{print $1, $3}' file.txt # 第一和第三列
# 打印最后一列
$ awk '{print $NF}' file.txt
# 指定分隔符
$ awk -F',' '{print $1}' file.csv
$ awk -F':' '{print $1}' /etc/passwd
内置变量 #
text
┌─────────────────────────────────────────────────────────────┐
│ awk 内置变量 │
├─────────────────────────────────────────────────────────────┤
│ │
│ $0 整行内容 │
│ $1-$n 第 n 列 │
│ NF 字段数量 │
│ NR 当前记录号(行号) │
│ FNR 当前文件记录号 │
│ FS 字段分隔符(默认空格) │
│ RS 记录分隔符(默认换行) │
│ OFS 输出字段分隔符 │
│ ORS 输出记录分隔符 │
│ FILENAME 当前文件名 │
│ │
└─────────────────────────────────────────────────────────────┘
条件和模式 #
bash
# 条件匹配
$ awk '$1 > 100' file.txt # 第一列大于 100
$ awk '$3 == "error"' file.txt # 第三列等于 error
$ awk '$1 > 10 && $2 < 20' file.txt
# 正则匹配
$ awk '/pattern/' file.txt # 包含 pattern
$ awk '/^start/' file.txt # 以 start 开头
$ awk '$1 ~ /pattern/' file.txt # 第一列匹配
$ awk '$1 !~ /pattern/' file.txt # 第一列不匹配
# 行号条件
$ awk 'NR == 10' file.txt # 第 10 行
$ awk 'NR >= 10 && NR <= 20' file.txt
$ awk 'NR % 2 == 0' file.txt # 偶数行
# BEGIN 和 END
$ awk 'BEGIN {print "Start"} {print} END {print "End"}' file.txt
计算和统计 #
bash
# 求和
$ awk '{sum += $1} END {print sum}' file.txt
# 求平均值
$ awk '{sum += $1} END {print sum/NR}' file.txt
# 求最大值
$ awk 'BEGIN {max = 0} {if ($1 > max) max = $1} END {print max}' file.txt
# 统计行数
$ awk 'END {print NR}' file.txt
# 统计单词数
$ awk '{total += NF} END {print total}' file.txt
# 分组统计
$ awk '{count[$1]++} END {for (i in count) print i, count[i]}' file.txt
格式化输出 #
bash
# printf 格式化
$ awk '{printf "%-10s %5d\n", $1, $2}' file.txt
# 格式说明符
%s 字符串
%d 整数
%f 浮点数
%x 十六进制
%o 八进制
# 宽度和对齐
%-10s 左对齐,宽度 10
%10s 右对齐,宽度 10
%05d 补零,宽度 5
%.2f 保留 2 位小数
实用示例 #
bash
# 分析访问日志
$ awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 计算文件大小
$ ls -l | awk '{sum += $5} END {print sum}'
# 提取特定字段
$ awk -F':' '{print $1}' /etc/passwd
# 过滤和格式化
$ awk '$3 > 100 {printf "%-20s %10d\n", $1, $3}' file.txt
# CSV 处理
$ awk -F',' 'NR > 1 {sum += $3} END {print "Total:", sum}' data.csv
# 提取 IP 和 URL
$ awk '{print $1, $7}' access.log
# 统计每个 IP 的访问次数
$ awk '{ip[$1]++} END {for (i in ip) print ip[i], i}' access.log | sort -rn
cut - 切割字段 #
基本用法 #
bash
# 按字节切割
$ cut -b 1-10 file.txt # 第 1-10 个字节
$ cut -b 1,3,5 file.txt # 第 1、3、5 个字节
# 按字符切割
$ cut -c 1-10 file.txt # 第 1-10 个字符
# 按字段切割
$ cut -f 1 file.txt # 第 1 个字段
$ cut -f 1,3 file.txt # 第 1、3 个字段
$ cut -f 1-3 file.txt # 第 1-3 个字段
指定分隔符 #
bash
# -d 指定分隔符
$ cut -d':' -f1 /etc/passwd # 以 : 分隔,取第 1 字段
$ cut -d',' -f1,3 file.csv # 以 , 分隔,取第 1、3 字段
$ cut -d' ' -f2 file.txt # 以空格分隔
# 多字符分隔符(需要配合其他命令)
$ awk -F'::' '{print $1}' file.txt
常用选项 #
bash
# --complement 补集
$ cut -f1 --complement file.txt # 除第 1 字段外的所有字段
# --output-delimiter 输出分隔符
$ cut -d':' -f1,7 --output-delimiter=' ' /etc/passwd
# -s 不显示不含分隔符的行
$ cut -d':' -f1 -s /etc/passwd
实用示例 #
bash
# 提取用户名
$ cut -d':' -f1 /etc/passwd
# 提取 IP 地址
$ cut -d' ' -f1 access.log
# 提取文件扩展名
$ echo "file.txt" | cut -d'.' -f2
# 提取域名
$ echo "www.example.com" | cut -d'.' -f2-
# 提取时间
$ cut -d' ' -f4 access.log
sort - 排序 #
基本用法 #
bash
# 默认按字典序排序
$ sort file.txt
# 逆序排序
$ sort -r file.txt
# 数值排序
$ sort -n file.txt
# 按字段排序
$ sort -k2 file.txt # 按第 2 列排序
$ sort -k2,2 file.txt # 只按第 2 列排序
$ sort -k2n file.txt # 按第 2 列数值排序
常用选项 #
bash
# -n 数值排序
$ sort -n file.txt
# -r 逆序
$ sort -r file.txt
$ sort -rn file.txt # 数值逆序
# -k 按字段排序
$ sort -k2 file.txt
$ sort -k2,2n file.txt
$ sort -k1,1 -k2,2n file.txt # 先按第 1 列,再按第 2 列数值
# -t 指定分隔符
$ sort -t':' -k3n /etc/passwd
# -u 去重
$ sort -u file.txt
# -o 输出到文件
$ sort file.txt -o sorted.txt
# -c 检查是否已排序
$ sort -c file.txt
# -M 按月份排序
$ sort -M months.txt
# -h 人类可读数字排序
$ du -h | sort -h
实用示例 #
bash
# 按文件大小排序
$ ls -lS
# 按数字排序
$ sort -n numbers.txt
# 按第 3 列数值排序
$ sort -k3n data.txt
# 按时间戳排序
$ sort -t' ' -k4 access.log
# 排序并去重
$ sort -u file.txt
# 按内存使用排序
$ ps aux --sort=-%mem | head -10
# 按文件大小排序
$ du -h --max-depth=1 | sort -h
uniq - 去重 #
基本用法 #
bash
# 去除连续重复行
$ uniq file.txt
# 只显示重复行
$ uniq -d file.txt
# 只显示唯一行
$ uniq -u file.txt
# 显示重复次数
$ uniq -c file.txt
常用选项 #
bash
# -c 显示重复次数
$ uniq -c file.txt
# -d 只显示重复行
$ uniq -d file.txt
# -D 显示所有重复行
$ uniq -D file.txt
# -u 只显示唯一行
$ uniq -u file.txt
# -i 忽略大小写
$ uniq -i file.txt
# -f 跳过前 n 个字段
$ uniq -f 1 file.txt
# -s 跳过前 n 个字符
$ uniq -s 10 file.txt
# -w 只比较前 n 个字符
$ uniq -w 10 file.txt
实用示例 #
bash
# 统计每个 IP 的访问次数
$ cut -d' ' -f1 access.log | sort | uniq -c | sort -rn
# 找出重复行
$ sort file.txt | uniq -d
# 统计唯一 IP 数量
$ cut -d' ' -f1 access.log | sort -u | wc -l
# 找出只出现一次的行
$ sort file.txt | uniq -u
# 统计单词出现次数
$ cat file.txt | tr ' ' '\n' | sort | uniq -c | sort -rn
tr - 字符转换 #
基本用法 #
bash
# 字符替换
$ tr 'a' 'b' < file.txt # a 替换为 b
$ tr 'abc' 'xyz' < file.txt # a->x, b->y, c->z
# 字符范围
$ tr 'a-z' 'A-Z' < file.txt # 小写转大写
$ tr 'A-Z' 'a-z' < file.txt # 大写转小写
删除和压缩 #
bash
# -d 删除字符
$ tr -d 'a' < file.txt # 删除所有 a
$ tr -d '0-9' < file.txt # 删除所有数字
$ tr -d '\n' < file.txt # 删除所有换行
$ tr -d '\r' < file.txt # 删除所有回车
# -s 压缩重复字符
$ tr -s ' ' < file.txt # 压缩多个空格为一个
$ tr -s '\n' < file.txt # 压缩多个空行为一个
# 组合使用
$ tr -s ' ' | tr ' ' '\t' # 空格转制表符
字符类 #
bash
# 预定义字符类
$ tr '[:lower:]' '[:upper:]' < file.txt # 小写转大写
$ tr -d '[:digit:]' < file.txt # 删除数字
$ tr -d '[:punct:]' < file.txt # 删除标点
$ tr -d '[:space:]' < file.txt # 删除空白
# 常用字符类
[:alnum:] 字母和数字
[:alpha:] 字母
[:digit:] 数字
[:lower:] 小写字母
[:upper:] 大写字母
[:space:] 空白字符
[:punct:] 标点符号
实用示例 #
bash
# 小写转大写
$ echo "hello" | tr 'a-z' 'A-Z'
HELLO
# 删除数字
$ echo "abc123def" | tr -d '0-9'
abcdef
# 压缩空格
$ echo "a b c" | tr -s ' '
a b c
# 删除换行
$ cat file.txt | tr -d '\n'
# Windows 换行转 Unix
$ tr -d '\r' < windows.txt > unix.txt
# 删除所有空白
$ tr -d '[:space:]' < file.txt
小结 #
通过本节学习,你应该掌握:
- sed:流编辑器,替换、删除、插入
- awk:文本处理语言,字段处理、统计
- cut:切割字段
- sort:排序
- uniq:去重
- tr:字符转换
下一步,我们将学习文本搜索命令。
最后更新:2026-04-11