shell字符串截取(cut)

字符串截取操作cut,cut以行为单位进行操作。
cut命令主要是接受三个定位方法:
第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f

-b,下面代码块中详述-b操作
//目标操作串-b
    [lj@localhost script]$ ps
      PID TTY          TIME CMD
     2729 pts/0    00:00:00 bash
     2888 pts/0    00:00:00 vim
     6145 pts/0    00:00:00 ps
1. 按行操作,取每行第1-8个字符
    [lj@localhost script]$ ps|cut -b 1-8 
      PID TT
     2729 pt
     2888 pt
     6146 pt
     6147 pt
2. -b支持形如3-5的写法,而且多个定位之间用逗号隔开就成了
    [lj@localhost script]$ ps|cut -b 1-8,11
      PID TT 
     2729 pt0
     2888 pt0
     6151 pt0
     6152 pt0
    但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。不能颠倒定位的顺序
    [lj@localhost script]$ ps|cut -b 11,1-8
      PID TT 
     2729 pt0
     2888 pt0
     6153 pt0
     6154 pt0
3. -3表示从第一个字节到第三个字节,而3-表示从第三个字节到行尾。如果你细心,你可以看到这两种情况下,都包括了第三个字节。
    [lj@localhost script]$ ps|cut -b -3
      P
     27
     28
     61
     61
    [lj@localhost script]$ ps|cut -b 3-
    PID TTY          TIME CMD
    729 pts/0    00:00:00 bash
    888 pts/0    00:00:00 vim
    157 pts/0    00:00:00 ps
    158 pts/0    00:00:00 cut
    [lj@localhost script]$ ps|cut -b -3,3-//执行ps|cut -b -3,3-,答案是输出整行,不会出现连续两个重叠的c的
      PID TTY          TIME CMD
     2729 pts/0    00:00:00 bash
     2888 pts/0    00:00:00 vim
     6159 pts/0    00:00:00 ps
     6160 pts/0    00:00:00 cut
-c

按照字符来操作,虽然都是对字符串的操作,但是例如中文每个字符就不是一个字节,所以-c操作与-b有所区别,但其操作写法和-b一致

    //目标操作串
    [lj@localhost script]$ cat cut_exp.txt
    中华人民共和国
    中华人民共和国
    中华人民共和国
    [lj@localhost script]$ cat cut_exp.txt|cut -c 3-
    人民共和国
    人民共和国
    人民共和国
-f

为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。
(下面的讲解内容是在假设你对/etc/passwd文件的内容和组织形式比较了解的情况下进行的。)
如果你观察过/etc/passwd文件,你会发现,它并不像who或者ps的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。
我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!

//以/etc/passwd的前五行内容为例:
[lj@localhost script]$ cat /etc/passwd|head -n 5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[lj@localhost script]$ cat /etc/passwd|head -n 5|cut -d : -f 1
root
bin
daemon
adm
lp
//-d设置间隔符为冒号,然后用-f来设置我要取的是第一个域,再按回车,所有的用户名就都列出来了,在设定-f时,也可以使用例如3-5或者4-类似的格式

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

[lj@localhost script]$ cat cut_space.txt
this is tab    finish.
this is several space finish.
[lj@localhost script]$ sed -n l cut_space.txt
this is tab\tfinish.$
this is several space finish.$

如上,如果是制表符(TAB),那么会显示为\t符号,如果是空格,就会原样显示。通过此方法即可以判断制表符和空格了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值