Linux 的 cut 命令是一个非常有用的命令行工具,能够通过分割文本行的方式提取文件中的特定字段。
cut 命令的基本用法是:

  1. 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 “[:,]” 命令来将文本行以冒号或逗号为分隔符进行分割。
使用正则表达式作为分隔符的格式如下:

  1. cut -d REGEXP [FILE]...

其中,REGEXP 是正则表达式,[FILE] 是要分割的文件名。

cut 中的范围

在使用 cut 命令时,你可以使用范围来提取文本行的特定字段。范围的格式如下:

  1. 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 选项的分割结果也可能不同。例如,假设你有一个文本文件,包含了如下的内容:

  1. 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 选项,以便获得更精确的分割结果。

  1. root@pppoe-885172fb80f6:/# echo 'abcdefg' | cut -b 3-5
  2. cde
  3. root@pppoe-885172fb80f6:/# echo 'abcdefg' | cut -c 3-5
  4. cde
  5. root@pppoe-885172fb80f6:/#

实例2 ( -d 和 -f )

除了以上几个选项之外,还有一些其他的选项,可以用于定制 cut 命令的行为。例如,你可以使用 —output-delimiter 选项来指定输出的字段之间的分隔符,使用 —complement 选项来提取所有不包含在指定字段范围内的字段,或者使用 —only-delimited 选项来忽略没有分隔符的文本行。
举个例子,假设你有一个文件 users.txt,包含了如下的用户信息:

  1. #!/usr/bin/env bash
  2. __main() {
  3. cat >users.txt <<"EOF"
  4. user1:101,102,103,104,105
  5. user2:201,202,203,204,205
  6. user3:301,302,303,304,305
  7. EOF
  8. cat users.txt
  9. }
  10. __main

你可以使用以下的 cut 命令来提取不同的信息:

  1. # 写入配置测试文件
  2. root@pppoe-885172fb80f6:/apps/app# cat >users.txt<<"EOF"
  3. user1:100:200
  4. user2:300:400
  5. user3:500:600
  6. EOF
  7. root@pppoe-885172fb80f6:/apps/app# cat users.txt
  8. user1:100:200
  9. user2:300:400
  10. user3:500:600
  11. # 提取用户名
  12. root@pppoe-885172fb80f6:/apps/app# cut -d : -f 1 users.txt
  13. user1
  14. user2
  15. user3
  16. # 提取第二个数字, cut 不支持多个分割条件, 所以分两次
  17. root@pppoe-885172fb80f6:/apps/app# cat users.txt | cut -d : -f 2 | cut -d , -f1
  18. 101
  19. 201
  20. 301

推荐阅读

Linux shell cut命令
linux cut命令 - zed99 - 博客园