Ubuntu下cut命令的使用

1.简介

cut命令用于从文件或者标准输入中读取内容并截取每一行的特定部分并送到标准输出。它是以每一行为一个处理对象的,这种机制和sed是一样的。

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

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

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

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

3.语法

cut -c/-b list [file...]

cut -f list [-d delim] [file]          或者         cut [-d delim] -f list

-b:按字节截取方式

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who
wytzxd   tty7         2011-05-25 09:01 (:0)
wytzxd   pts/0        2011-05-25 09:34 (:0)

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b 3                   //在-b后面必须指定数字,表示要截取哪个字节
t
t

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b 2,3-5,10        //想要截取多个的写法 ,
ytzxt
ytzxp
但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。不能颠倒定位的顺序。

eg:

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b 3-5,10,2         //结果与上面相同
ytzxt
ytzxp

其他:

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b 3-                 //第三个字符以及后面所有
tzxd   tty7         2011-05-25 09:01 (:0)
tzxd   pts/0        2011-05-25 09:34 (:0)
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b -3                //第三个字符以及前面所有
wyt

wyt

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b -3,3-            //第三个字符不会重复
wytzxd   tty7         2011-05-25 09:01 (:0)

wytzxd   pts/0        2011-05-25 09:34 (:0)

-c:按字符截取方式

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -c 3,5
tx
tx

不过,看着怎么和-b没有什么区别啊?莫非-b和-c作用一样? 其实不然,看似相同,只是因为这个例子举的不好,who输出的都是单字节字符,所以用-b和-c没有区别,如果你提取中文,区别就看出来了,来,看看中文提取的情况:

(-c也是乱码,没解决)

cut -c num1-num2 filename   说明:显示每行从开头算起 num1 到 num2 的文字

who | cut -c 1-10
wytzxd   t
wytzxd   p

-f list:按字段截取

list为字段编号或一段范围的列表(以逗号隔开)

-d delim:通过-f选项,使用delim作为定界符。默认的定界符为制表符(Tab)

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cat cut_f
wang,yan,ting
wang,yan,lun
zuo,hai,zhi
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -d , -f 3 cut_f                  //以逗号为分隔符
ting
lun
zhi
-b,-c 和 -f 参数可以跟以下子参数:

  N 第N个字符或字段

  N- 从第一个字符或字段到文件结束

  N-M 从第N个到第M个字符或字段

  -M 从第一个到第N个字符或字段

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -d , -f 1,3 cut_f > test1
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cat test1 
wang,ting
wang,lun
zuo,zhi

注意:

1.如果遇到空格和制表符时,怎么分辨呢?

有时候制表符确实很难辨认,有一个方法可以看出一段空格到底是由若干个空格组成的还是由一个制表符组成的。

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cat cut_t
wang  yan    ting
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ sed -n l cut_t                         //sed -n后面的字符是L的小写字母
wang  yan\tting$

2.我应该在cut -d中用什么符号来设定制表符或空格

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

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -f 1 cut_t
wang  yan
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -f 2 cut_t
ting
如果你设定一个空格为间隔符,那么就这样:

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -f 1 -d ' ' cut_t             //两个单引号之间可确实要有一个空格
wang
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -f 2 -d ' ' cut_t

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -f 3 -d ' ' cut_t
yan    ting

为什么第二个例子会是空??

因为你只能在-d后面设置一个空格,不许设置多个空格,因为cut只允许间隔符是一个字符;

此例中,wang后有两个空格,所以以一个为定界符后,另一个以字符形式输出;

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

posted @ 2022-11-01 15:52  neilge  阅读(312)  评论(0)    收藏  举报