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
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 功能相对简单,有些场景不太适用:
分隔符只能是单字符:不能用多字符作为分隔符。
不能处理连续分隔符:多个连续的分隔符会被当作多个空字段。
不能重新排列字段:只能提取,不能改变顺序。
遇到这些情况,用 awk 更合适:
awk -F: '{print $3, $1, $7}' /etc/passwd
awk -F'[ ,]+' '{print $1}' data.txt
简单提取用 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 更灵活。
-b 按字节,-c 按字符,-f 按字段-d 指定分隔符,默认是制表符-c 而不是 -b