cut 切割文本

cut 是一个简单实用的文本切割工具,可以按字节、字符或字段提取文本的特定部分。虽然功能不如 awk 强大,但对于简单的提取操作,cut 更简洁直接。

基本语法

cut [选项] 文件

常用选项:

选项含义
-b按字节切割
-c按字符切割
-f按字段切割
-d指定分隔符
-s不输出不包含分隔符的行

按字节切割

-b 按字节位置提取:

echo "Hello World" | cut -b 1-5
echo "Hello World" | cut -b 1,3,5
echo "Hello World" | cut -b -5
echo "Hello World" | cut -b 6-

运行结果:

Hello
Hlo
Hello
 World

1-5 表示第1到第5字节,1,3,5 表示第1、3、5字节,-5 表示从开头到第5字节,6- 表示从第6字节到结尾。

按字符切割

-c 按字符位置提取,对多字节字符(如中文)处理正确:

echo "你好世界" | cut -c 1-2
echo "你好世界" | cut -c 3-

运行结果:

你好
世界

如果用 -b 处理中文,可能会出现乱码,因为一个中文字符占多个字节。

按字段切割

-f 按字段提取,默认以制表符为分隔符:

echo -e "a\tb\tc" | cut -f 1
echo -e "a\tb\tc" | cut -f 1,3
echo -e "a\tb\tc" | cut -f 2-

指定分隔符

-d 指定分隔符:

echo "a:b:c" | cut -d: -f 1
echo "a:b:c" | cut -d: -f 1,3
echo "a:b:c" | cut -d: -f 2-

运行结果:

a
a:c
b:c

实用示例

提取用户名

cut -d: -f 1 /etc/passwd

提取 IP 地址

echo "192.168.1.100" | cut -d. -f 1-3

运行结果:

192.168.1

提取文件扩展名

echo "document.txt" | cut -d. -f 2
echo "archive.tar.gz" | cut -d. -f 2-

运行结果:

txt
tar.gz

提取特定列

cut -d, -f 1,3 data.csv
cut -d' ' -f 1 access.log

提取日期部分

echo "2024-03-15" | cut -d- -f 1
echo "2024-03-15" | cut -d- -f 2-

运行结果:

2024
03-15

配合其他命令

ls -l | cut -c 1-10
ps aux | cut -c 1-80
who | cut -d' ' -f 1 | sort | uniq

cut 的局限性

cut 功能相对简单,有些场景不太适用:

分隔符只能是单字符:不能用多字符作为分隔符。

不能处理连续分隔符:多个连续的分隔符会被当作多个空字段。

不能重新排列字段:只能提取,不能改变顺序。

遇到这些情况,用 awk 更合适:

awk -F: '{print $3, $1, $7}' /etc/passwd
awk -F'[ ,]+' '{print $1}' data.txt

cut vs awk

简单提取用 cut,复杂操作用 awk:

cut -d: -f 1 /etc/passwd
awk -F: '{print $1}' /etc/passwd

cut -d, -f 1,3 data.csv
awk -F, '{print $1, $3}' data.csv

cut 更简洁,awk 更灵活。

小结

  • cut 用于简单的文本切割和字段提取
  • -b 按字节,-c 按字符,-f 按字段
  • -d 指定分隔符,默认是制表符
  • 处理中文用 -c 而不是 -b
  • 复杂操作用 awk 更合适