cut命令

-- TOC --

cut是一个在Linux命令行,按行处理文本的命令,它主要用于截取文本,将指定的内容输出,其它删除。

cut - remove sections from each line of files

-b:以byte为单位截取,后面跟截取范围的选择。

$ uname -a
Linux K 5.14.14 #1 SMP Tue Oct 26 10:20:53 CST 2021 x86_64 x86_64 x86_64 GNU/Linux
$ uname -a | cut -b 1
L
$ uname -a | cut -b 2
i
$ uname -a | cut -b 1-5  # 1 to 5
Linux
$ uname -a | cut -b 1,5  # 1 and 5
Lx

-c-b一样,在多字节字符的时候使用!

-f-d的配合,可以按field截取内容,-d后面跟分隔符,默认分隔符是tab。

 uname -a | cut -d' ' -f 1
Linux
$ uname -a | cut -d' ' -f 2
K
$ uname -a | cut -d' ' -f 3
5.14.14
$ uname -a | cut -d' ' -f 1-5
Linux K 5.14.14 #1 SMP

截取范围的选择规则如下:

Use one, and only one of -b, -c or -f. Each LIST is made up of one range, or many ranges separated by commas. Selected input is written in the same order that it is read, and is written exactly once. Each range is one of:

N N'th byte, character or field, counted from 1

N- from N'th byte, character or field, to end of line

N-M from N'th to M'th (included) byte, character or field

-M from first to M'th (included) byte, character or field

cut命令按field截取的问题,在于太过于严格,如果需要分割的行本身分割的不够清晰,cut命令就会问题,这个命令会严格按照-d分隔符进行操作:

$ echo 'a...b..c' | cut -d. -f 1
a
$ echo 'a...b..c' | cut -d. -f 2

$ echo 'a...b..c' | cut -d. -f 3

$ echo 'a...b..c' | cut -d. -f 4
b

上例,ab之间有3个点,bc之间2个点,cut这时按点分割就不太行了。其实这个时候,awk命令也不行,但awk与cut不同点在于,对于空格的处理,cut严格按照一个空格进行分割,连续的空格就不行,awk对连续的空格是可以的。所以,对于这种情况,可以这样:

$ echo 'a...b..c' | sed '/./s/[.]/ /g' | awk '{print $1 $2 $3}'
abc

先用sed命令,将点替换成空格,然后再用awk命令提出每一列。

也可以将连续的分隔符用tr命令做去重,然后再使用cut命令:

$ echo 'a...b..c' | tr -s '.' | cut -d. -f 2
b

cut命令的另一个特点是,它会对输入的每一行都进行同样的操作,不能选择行,缺少一点灵活性。

$ echo 'a b c
1 2 3
4 5 6
f g h' | cut -d' ' -f3
c
3
6
h

本文链接:https://cs.pynote.net/sf/linux/shell/202112016/

-- EOF --

-- MORE --