命令详解 cut

cut 用于按字节、字符或字段选取每一行的一部分,适合处理结构稳定、分隔符明确的文本。它不会理解 CSV 引号、转义、可变空白或 JSON 结构;遇到这些数据应改用专用解析器、awk、jq 或 Python。

基本语法

cut OPTION... [FILE]...

三种主要选择方式互斥:

  • -b LIST:选择字节。
  • -c LIST:选择字符位置;在部分实现和区域设置中与字节行为有关,复杂 Unicode 文本不要只靠位置截取。
  • -f LIST:按字段选择,默认分隔符是制表符。

范围写法:

1       第 1 项
1,3,5   第 1、3、5 项
2-4     第 2 到第 4 项
-3      从开头到第 3 项
4-      从第 4 项到行尾

按字段提取

# /etc/passwd 中的用户名和登录 shell
cut -d: -f1,7 /etc/passwd

# 以 Tab 分隔的数据取第 2~4 列
cut -f2-4 data.tsv

# 只输出包含分隔符的行
cut -d: -s -f1 mixed.txt

-s 的含义是“不输出不含字段分隔符的行”,不是删除空行。-d 只接受单个输入分隔字符,不能直接表示正则表达式或多个连续空格。

补集与输出分隔符

# 除第 2 列之外的所有列
cut -d, --complement -f2 data.txt

# 输入用冒号,输出改为 Tab
cut -d: -f1,3 --output-delimiter=$'\t' data.txt

按字符或字节

# 每行前 8 个字符
cut -c1-8 file.txt

# 取第 1~16 个字节
cut -b1-16 binary-safe-list.txt

中文、emoji、组合字符和不同区域设置可能占多个字节或由多个码点组成。若要求按“用户看到的字符”精确切分,应使用支持 Unicode 字素簇的工具,而不是假设 -b、-c 总能得到相同结果。

常见误区

用 cut 解析 CSV

下面这行的第二个字段包含逗号:

1001,"上海,浦东",active

cut -d, -f2 不会识别双引号规则,结果会错误。应使用真正的 CSV 解析库。

用空格分隔命令输出

命令输出通常包含数量不定的空格,cut -d' ' 会产生大量空字段。可使用:

awk '{print $1, $3}' file.txt

但自动化脚本最好让源命令输出 JSON、NUL 分隔或固定列,而不是解析面向人的显示文本。

把 -n 当作行号功能

GNU cut 没有“显示行号”的 -n 用法。需要行号可使用 nl -ba file.txt,再按需求处理。

实用组合

# 从 Tab 分隔文件取列并去重
cut -f3 inventory.tsv | sort -u

# NUL 分隔文件名:先确认本机 cut 支持 -z
find . -type f -print0 | cut -z -c3-

文件名、换行符和特殊字符场景应优先使用 NUL 分隔能力,并确认管道中的每个命令都支持它。

官方参考

Copyright © yan-jian.com 2023 - 2026 · Powered by GitBook更新时间: 2026-10-17 14:18:57

results matching ""

    No results matching ""