cut 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
cut——文本处理命令族(见文本处理命令族)。它是管道里"只取某几列"的轻量工具,和 awk 互补。
cut 从一个文件的每一行里"切"出指定的部分:要么按分隔符取某些字段,要么按字符位置取某段。它功能单一但极快,适合"我就想拿第 2 列"这种简单取列场景。
一、按分隔符取列:-d 与 -f
cut -d: -f1 /etc/passwd # 以冒号分隔,取第 1 列(用户名)
cut -d, -f1,3 data.csv # 逗号分隔,取第 1、3 列
cut -d' ' -f2-4 file # 空格分隔,取第 2 到 4 列
-d指定分隔符(紧跟其后,空格要引号),-f指定取哪些字段(逗号列多个、-表范围、N-表 N 到末尾)。cut -d: -f1 /etc/passwd是经典用法——取系统所有用户名。注意 cut 的字段分隔符只能是单个字符,多个空格连着会被当多个分隔符(这点不如 awk 聪明)。
二、按字符位置:-c
cut -c1-10 file # 取每行前 10 个字符
cut -c 5- # 从第 5 个字符到末尾
cut -c1,3,5 file # 取第 1、3、5 个字符
-c按字符位置切,适合处理固定宽度的数据(如某些老式日志、定长报表)。和-f二选一:有分隔符用-d/-f,定宽用-c。
三、cut vs awk:怎么选
# 简单取列:cut 更轻
cut -d: -f1 /etc/passwd
# 同样的事 awk 也能,但要起一个更"重"的进程
awk -F: '{print $1}' /etc/passwd| 场景 | 用 |
|---|---|
| 固定分隔符、取连续/指定列、无计算 | cut(快、简单) |
| 多字符分隔符、按列计算/过滤/重组 | awk(见 awk) |
cut 的分隔符只能是单字符,且不能"按多个空格当一个分隔"——遇到不规则空白分隔,cut 会翻车,这时换 awk(默认按空白、连续多个当一隔)。所以经验是:规则分隔(
:、,、|)用 cut,复杂文本用 awk。两者不冲突,cut 是 awk 的轻量替身。
四、实战:从日志取字段
# access.log 格式:IP - - [时间] "GET /path" 状态码 ...
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head # 统计访问最多的 IP
# 取第 9 列(状态码)统计
cut -d' ' -f9 access.log | sort | uniq -c第一条把 IP(第 1 列)切出来,接 sort | uniq -c 计数(这种聚合套路在 grep 实战 也用过)。不过日志里字段间常是多个空格,cut 不如 awk 稳——更稳妥写 awk '{print $1}'。cut 适合分隔符规整的数据(CSV、passwd、定宽)。
一句话总结
cut = 轻量取列器:-d 指定单字符分隔符 + -f 取字段(逗号多列、- 范围)、-c 按字符位置切(定宽数据);适合规则分隔(:、,)的简单取列,比 awk 轻快;但分隔符只能单字符、不擅长多空格,复杂文本换 awk。管道里"我只想拿第 N 列"时首选。