cut、tr、sort 和 uniq 生产典型示例

1. cut 命令详解

功能
  • 提取文本的指定字段(列)或字符范围
  • 适合处理 分隔符分隔的文本 (如 CSV、TSV)或 固定宽度文本
语法
复制代码
cut [选项] 文件
常用参数
参数 说明
-d 分隔符 指定字段分隔符(默认是制表符 \t
-f N 提取第 N 个字段(支持逗号分隔的多个字段,如 -f1,3
-c N-M 提取第 N 到第 M 个字符(支持范围如 1-10
-b N-M 类似 -c,但按字节提取(不推荐,因字符编码问题)
示例
  1. 提取 CSV 文件的第2列和第4列

    复制代码
    cut -d ',' -f2,4 data.csv
    • 输入id,name,age,city
    • 输出name,city
  2. 提取固定宽度文本的前10个字符

    复制代码
    cut -c1-10 fixed_width.txt
    • 输入abcdefghijklmnopqrstuv
    • 输出abcdefghij
  3. 从日志中提取 IP 地址

    复制代码
    cut -d ' ' -f1 access.log
    • 输入192.168.1.1 - - [15/Aug/2025:17:16:28 +0000] "GET / HTTP/1.1"
    • 输出192.168.1.1
常见问题
  • 为什么 cutawk 快?
    cut 是单行处理工具,直接按字段或字符提取,无需解析正则表达式,适合简单任务。

  • 如何处理多级分隔符?
    若字段分隔符是空格和逗号混合,可先用 tr 替换为统一分隔符:

    复制代码
    tr ' ' ',' < input.txt | cut -d ',' -f1,3

2. tr 命令详解

功能
  • 字符级别的转换、删除或压缩
  • 适合处理字符替换、清理冗余字符。
语法
复制代码
tr [选项] [字符集1] [字符集2]
常用参数
参数 说明
s 压缩连续重复字符(如多个空格变一个)
d 删除指定字符
c 反转字符集(保留不在字符集中的字符)
示例
  1. 小写转大写

    复制代码
    tr 'a-z' 'A-Z' < input.txt
    • 输入hello world
    • 输出HELLO WORLD
  2. 删除数字

    复制代码
    tr -d '0-9' < input.txt
    • 输入abc123def456
    • 输出abcdef
  3. 压缩连续空格

    复制代码
    tr -s ' ' < input.txt
    • 输入This is a test
    • 输出This is a test
常见问题
  • 为什么 trsed 快?
    tr 是字符级操作,直接映射字符,而 sed 需要逐行匹配正则表达式。

  • 如何删除所有空格?

    复制代码
    tr -d ' ' < input.txt

3. sort 命令详解

功能
  • 对文本行进行排序,支持按列、数字、稳定性排序。
语法
复制代码
sort [选项] 文件
常用参数
参数 说明
-t 分隔符 指定字段分隔符(默认是空格或制表符)
-k N 按第 N 列排序(支持范围如 -k1,1
-n 按数字排序
-r 逆序排序
-s 稳定排序(保留原始顺序)
-m 合并已排序的文件
示例
  1. 按姓名和年龄排序用户列表

    复制代码
    sort -t ',' -k1,1 -k2,2n users.csv
    • 输入Alice,30,Bob,25
    • 输出Alice,30,Bob,25(按姓名升序,年龄降序)
  2. 合并两个已排序文件

    复制代码
    sort -m file1.txt file2.txt > merged.txt
    • 前提file1.txtfile2.txt 已按相同规则排序。
  3. 统计 IP 访问量前10

    复制代码
    cut -d ' ' -f1 access.log | sort | uniq -c | sort -nr | head -n 10
常见问题
  • 如何稳定排序?
    使用 -s 参数确保相同键值的行保持原顺序。

  • 如何按数字排序?
    使用 -n 参数,例如:

    复制代码
    sort -n numbers.txt

4. uniq 命令详解

功能
  • 去除相邻的重复行 ,常与 sort 配合使用。
语法
复制代码
uniq [选项] 文件
常用参数
参数 说明
-c 统计重复次数
-d 仅显示重复的行
-u 仅显示唯一的行
示例
  1. 统计 IP 访问量

    复制代码
    cut -d ' ' -f1 access.log | sort | uniq -c
    • 输出10 192.168.1.1(IP 出现10次)
  2. 去除重复行

    复制代码
    sort data.txt | uniq
  3. 找出重复的错误日志

    复制代码
    sort error.log | uniq -d
常见问题
  • 为什么 uniq 需要先排序?
    uniq 只能去除 相邻 的重复行,因此必须先用 sort 排序。

  • 如何统计唯一行?
    使用 -u 参数:

    复制代码
    sort data.txt | uniq -u

总结对比

命令 核心功能 不可替代性 典型场景
cut 字段/字符提取 简单高效,适合大文件 提取日志字段、CSV列
tr 字符转换/删除/压缩 轻量级字符操作 清理空格、大小写转换
sort 排序/合并 内置高效排序算法 统计IP访问量、合并文件
uniq 去重/统计 依赖排序的去重工具 日志去重、统计重复行

实际生产场景示例

1. 日志分析:统计访问量前10的 IP
复制代码
cut -d ' ' -f1 access.log | sort | uniq -c | sort -nr | head -n 10
  • 流程
    1. cut 提取 IP 列;
    2. sort 排序;
    3. uniq -c 统计重复次数;
    4. sort -nr 按访问量倒序排序;
    5. head 取前10条。
2. 数据清洗:清理 CSV 文件
复制代码
tr -s ' ' < data.csv | cut -d ',' -f1,3,5
  • 流程
    1. tr 压缩空格;
    2. cut 提取关键列。
3. 性能监控:提取进程内存使用率
复制代码
ps aux | sort -k4 -nr | head -n 5
  • 流程
    1. ps 获取进程信息;
    2. sort 按内存使用率倒序排序;
    3. head 取前5个进程。

常见错误与解决方法

  1. cut 提取字段时无输出

    • 原因:字段分隔符未正确指定(如默认是制表符)。

    • 解决 :使用 -d 指定分隔符,例如:

      复制代码
      cut -d ',' -f2 data.csv
  2. tr 无法删除字符

    • 原因 :未正确使用 -d 参数。

    • 解决 :明确指定删除字符:

      复制代码
      tr -d ' ' < input.txt
  3. sort 排序结果不正确

    • 原因:未按数字排序(默认按字符串排序)。

    • 解决 :使用 -n 参数:

      复制代码
      sort -n numbers.txt
  4. uniq 无法去重

    • 原因:未先排序。

    • 解决 :先用 sort 排序:

      复制代码
      sort data.txt | uniq