文本处理 #

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

小结 #

通过本节学习,你应该掌握:

  1. sed:流编辑器,替换、删除、插入
  2. awk:文本处理语言,字段处理、统计
  3. cut:切割字段
  4. sort:排序
  5. uniq:去重
  6. tr:字符转换

下一步,我们将学习文本搜索命令。

最后更新:2026-04-11