写点什么

Linux 字符截取命令 -cut

发布于: 2021 年 04 月 26 日

Linux 字符截取命令-cut


作者 | WenasWei

一 Linux 之 cut 命令详解

将每个文件中选定的行部分打印到标准输出, 如果没有文件,或者文件是-,则读取标准输入,长选项的强制参数对于短选项也是强制的。


cut 是一个选取命令,一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的,用于显示每行从开头算起 num1 到 num2 的文字。

1.1 使用语法

  • cut [-bn] [file]

  • cut [-c] [file]

  • cut [-df] [file]

1.2 使用说明

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。


如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一, cut 默认以制表符为分隔符。


参数:


  • -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。

  • -c :以字符为单位进行分割。

  • -d :自定义分隔符,默认为制表符。

  • -f :与-d 一起使用,指定显示哪个区域。

  • -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除


在 -b、-c 或 -f 中只能使用一个。每个 LIST 由一个组成范围,或用逗号分隔的多个范围。选定的输入被写入顺序与读取和写入的顺序相同。

1.3 三个方法定位

cut 命令主要是接受三个定位方法:


  • 第一,字节(bytes),用选项 -b

  • 第二,字符(characters),用选项 -c

  • 第三,域(fields),用选项 -f

二 cut 帮助文档

执行命令查询帮助文档:


cut --help
复制代码



cut 帮助文档解析:

(1)'-b 字节列表'

'--bytes =字节列表'


选择仅打印字节列表中列出的位置中的 字节。制表符和退格键与其他任何字符一样;他们占用了 1 个字节。如果指定了输出定界符,然后在所选字节范围之间输出该字符串。

(2)'-c 字符列表'

'--characters =字符列表'


选择仅打印在 character-list 中列出的位置中的 字符。目前与 -b 相同,但是国际化将改变这种状况。制表符和退格键与其他任何字符一样;他们占 1 个字符。如果指定了输出定界符,然后在所选字节范围之间输出该字符串。

(3)'-d input_delim_byte'

'--delimiter = input_delim_byte'


和 -F,请使用 input_delim_byte 的第一个字节作为输入字段分隔符(默认为 TAB)。

(4)'-f 字段列表'

'--fields =字段列表'


选择仅打印在 field-list 中列出的字段。默认情况下,字段之间用 TAB 字符分隔。还要打印任何不包含定界符的行,除非 -仅定界 (-s)选项已指定。

(5)'-n'

不要拆分多字节字符。

(6)'-s'

'-仅定界'


为了 -F,请勿打印不包含字段分隔符的行。通常,任何没有字段分隔符的行都按原样打印。

三 命令详解与使用案例

3.1 实例一: 查询命令结合 cut -b

当你执行 who 命令时,会输出类似如下的内容:


$ whoroot     pts/1        2021-04-25 21:51 (58.62.93.183)root     pts/0        2021-04-25 21:50 (58.62.93.183)
复制代码
(1) 提取每一行的第 3 个字节
$ who|cut -b 3oo
复制代码
(2) 提取第 1,第 2、第 3 个字节

方案 1:


$ who |cut -b 1-3roorooroo
复制代码


方案 2:


$ who |cut -b 1,2,3roorooroo
复制代码


-b 支持形如 1-3 的写法,而且多个定位之间用逗号隔开就可以了。


注意:


cut 命令如果使用了-b 选项,那么执行此命令时,cut 会先把 -b 后面所有的定位进行从小到大排序,然后再提取。不能颠倒定位的顺序。

(3) 提取第 1 到第 3,第 5 和第 20 个字符之后的所有数据
who|cut -b 1-3,20-roo   2021-04-25 21:51 (58.62.93.183)roo   2021-04-25 21:50 (58.62.93.183)roo   2021-04-25 23:05 (58.62.93.183)
复制代码
(4) 提取第 n 个字节前后所有的字节

n = 2 的情况下


方案 1:


$ who |cut -b 2-oot     pts/1        2021-04-25 21:51 (58.62.93.183)oot     pts/0        2021-04-25 21:50 (58.62.93.183)oot     pts/2        2021-04-25 23:05 (58.62.93.183)
复制代码


方案 2:


$ who |cut -b -2rororo
复制代码

3.2 实例二: 文本文件结合 cut -c

(1)创建测试文件
  • 创建一份测试文件: test.txt


vi test.txt
复制代码


  • 测试文件内容数据


apple=苹果=pingguocreate=创建delect=删除exe=程序good=好的
复制代码
(2) -c 和 -b 的使用区别

-c 与命令查询结果:


who|cut -c 1-3,20-roo   2021-04-25 21:51 (58.62.93.183)roo   2021-04-25 21:50 (58.62.93.183)roo   2021-04-25 23:05 (58.62.93.183)
复制代码


看似查询结果相同,只是因为这个例子 who 输出取的数据都是字节字符,所以用 -b 和 -c 没有区别,如果你提取中文,区别就看出来了,看看中文提取的情况:


$ cut -b 3-10 test.txtple=苹eate=创lect=删e=程序od=好
$ cut -c 3-10 test.txtple=苹eate=创lect=删e=程序od=好
复制代码


  • 结果发现,这个问题不知道哪个版本已经修复了,附加上测试使用的 linux 版本,其他命令与 -b 使用类似,下面将不再一一列举。


$ cat /proc/versionLinux version 4.15.0-52-generic (buildd@lgw01-amd64-051) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #56-Ubuntu SMP Tue Jun 4 22:49:08 UTC 2019
复制代码

3.3 实例三: cut -d 与 -f 的共同使用

cut 的 -d 选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略 -d 选项,而直接用-f 来取域就可以了。

(1) 结合查询命令取出指定符号的切割的第一域
$ head -n 5  /etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/sync
$ head -n 5 /etc/passwd |cut -d ':' -f 1rootdaemonbinsyssync
复制代码
(2) 取出文档中指定符号的切割的第一域
$ head -n 5  test.txt |cut -d : -f 1apple=苹果=pingguocreate=创建delect=删除exe=程序good=好的
$ head -n 5 test.txt |cut -d = -f 2苹果创建删除程序好的
复制代码
(3)如上 -b 中的拼接规则同理使用
$ head -n 5  test.txt |cut -d = -f2-
$ head -n 5 test.txt |cut -d = -f2,3
$ head -n 5 test.txt |cut -d = -f2-3
复制代码
(4)分隔符必须为单个字符,多个异常如下
$ cat test.txt |cut -d '==' -f2-3cut: the delimiter must be a single character
复制代码

四 使用场景和缺陷不足

4.1 cut 的使用场景

  • cut 命令用来显示行中的指定部分,删除文件中指定字段

  • 脚本切割读取文件或者指定命令信息

  • 统计指定的服务器信息处理,进行归纳统计

4.2 cut 的缺陷和不足

  • 不能处理多空格

  • 如果文件里面的某些域是由若干个空格来间隔的,那么用 cut 就有点麻烦了,因为 cut 只擅长处理“以一个字符间隔”的文本内容

4.3 cut 和 awk 的差别

  • 当一个文件中每一行都含有一个或多个空格时,这时候只能用 awk 来分隔

  • cut 默认的分隔符是制表符,awk 默认的分隔符是一个空格或者多个空格或者是制表符

  • 语法格式不同

参考文档:

  • [1] 东方雨中漫步者.博客园: https://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html ,2011-12-09.

  • [2] GNU 操作系统: http://www.gnu.org/software/coreutils/manual/html_node/cut-invocation.html#cut-invocation

发布于: 2021 年 04 月 26 日阅读数: 16
用户头像

当你知道的越多,不知道的就越多! 2021.04.20 加入

在互联网浪潮下的程序人生!

评论

发布
暂无评论
Linux字符截取命令-cut