Linux 的 cut 命令是一个非常有用的命令行工具,能够通过分割文本行的方式提取文件中的特定字段。
cut 命令的基本用法是:
cut [OPTION]... [FILE]...
其中,[OPTION] 参数用于指定 cut 命令的行为,[FILE] 参数用于指定要分割的文件。
下面介绍几个常用的 cut 命令选项:
- -b 选项:以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
按字节偏移量分割文本。例如,使用 cut -b 1-5 file.txt 命令可以从 file.txt 文件的第一个字节开始,截取 5 个字节的内容。 - -c 选项:按字符偏移量分割文本。例如,使用 cut -c 1-5 file.txt 命令可以从 file.txt 文件的第一个字符开始,截取 5 个字符的内容。
- -d 选项:指定分隔符。例如,使用 cut -d : -f 1 file.txt 命令可以以冒号为分隔符,提取 `file.txt
选项
-b | 以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。 |
---|---|
-c | 以字符为单位进行分割。 |
-d | 与 -d 一起使用,自定义分隔符,默认为制表符。 |
-f | 与 -d 一起使用,指定显示哪个区域。 |
-n | 取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的 范围之内,该字符将被写出;否则,该字符将被排除 |
cut -d 中的正则
在使用 cut 命令时,你可以使用正则表达式作为分隔符,用于将文本行分割为不同的字段。例如,你可以使用 cut -d “[:,]” 命令来将文本行以冒号或逗号为分隔符进行分割。
使用正则表达式作为分隔符的格式如下:
cut -d REGEXP [FILE]...
其中,REGEXP 是正则表达式,[FILE] 是要分割的文件名。
cut 中的范围
在使用 cut 命令时,你可以使用范围来提取文本行的特定字段。范围的格式如下:
START-END
其中,START 是范围的起始位置,END 是范围的结束位置。
实例
实例1 (-c 和 -b)
cut 命令的 -c 选项和 -b 选项都用于分割文本行,但它们的分割方式是不同的。
- -c 选项:按字符偏移量分割文本。例如,使用 cut -c 1-5 file.txt 命令可以从 file.txt 文件的第一个字符开始,截取 5 个字符的内容。
- -b 选项:按字节偏移量分割文本。例如,使用 cut -b 1-5 file.txt 命令可以从 file.txt 文件的第一个字节开始,截取 5 个字节的内容。
由于字符和字节是两个不同的单位,所以 -c 选项和 -b 选项的分割结果也可能不同。例如,假设你有一个文本文件,包含了如下的内容:
Hello, World!
你可以使用以下的 cut 命令来提取不同的内容:
- 提取第一个字节:cut -b 1 file.txt,输出结果为 “H”
- 提取第二个字节:cut -b 2 file.txt,输出结果为 “e”
- 提取第三个字节:cut -b 3 file.txt,输出结果为 “l”
- 提取第四个字节:cut -b 4 file.txt,输出结果为 “l”
你可以发现,使用 -c 选项提取字符时,每个字符都会被提取出来;而使用 -b 选项提取字节时,每个字符都会被拆分成多个字节,并分别输出。
在使用 cut 命令时,你需要根据实际情况选择使用 -c 选项还是 -b 选项,以便获得更精确的分割结果。
root@pppoe-885172fb80f6:/# echo 'abcdefg' | cut -b 3-5
cde
root@pppoe-885172fb80f6:/# echo 'abcdefg' | cut -c 3-5
cde
root@pppoe-885172fb80f6:/#
实例2 ( -d 和 -f )
除了以上几个选项之外,还有一些其他的选项,可以用于定制 cut 命令的行为。例如,你可以使用 —output-delimiter 选项来指定输出的字段之间的分隔符,使用 —complement 选项来提取所有不包含在指定字段范围内的字段,或者使用 —only-delimited 选项来忽略没有分隔符的文本行。
举个例子,假设你有一个文件 users.txt,包含了如下的用户信息:
#!/usr/bin/env bash
__main() {
cat >users.txt <<"EOF"
user1:101,102,103,104,105
user2:201,202,203,204,205
user3:301,302,303,304,305
EOF
cat users.txt
}
__main
你可以使用以下的 cut 命令来提取不同的信息:
# 写入配置测试文件
root@pppoe-885172fb80f6:/apps/app# cat >users.txt<<"EOF"
user1:100:200
user2:300:400
user3:500:600
EOF
root@pppoe-885172fb80f6:/apps/app# cat users.txt
user1:100:200
user2:300:400
user3:500:600
# 提取用户名
root@pppoe-885172fb80f6:/apps/app# cut -d : -f 1 users.txt
user1
user2
user3
# 提取第二个数字, cut 不支持多个分割条件, 所以分两次
root@pppoe-885172fb80f6:/apps/app# cat users.txt | cut -d : -f 2 | cut -d , -f1
101
201
301