• linux命令学习笔记:cut详解


    cut命令从文件的每一行剪切字节、字符和字段并将它们写至标准输出。它是以文件的每一行作为处理对象的。 
     
    命令格式:cut [选项] [范围] 文件。选项用来指定单位(字节、字符还是字段),范围指定选项的位置。 
    常用的选项有:
    -b:指定以字节为单位显示选中内容
    -c:指定以字符为单位显示选中内容
    -f:指定以字段为单位显示选中内容
    -d:指定字段的分界符,默认为制表符
    其它的选项还有-n(仅和-b选项一起使用)、-s(仅和-f选项一起使用)
    范围表示:
    n:第n个字节/字符/字段
    n-:从第n个字节/字符/字段到最后一个字节/字符/字段
    n-m:从第n个字节/字符/字段到第m个字节/字符/字段,包括m
    -m:从行的开头到第m个字节/字符/字段,包括m
    -:从行开头到行的最后
    一、显示passwd文件中用户名、密码、用户ID和用户目录。
    
    passwd文件每行分为七列,以:为分隔符;这七列依次是用户名、密码、用户ID、组ID、用户描述、用户目录、用户bash。由于passwd文件内容过多,我们这里用sed显示其中的1-6行。
    二、显示前两个字节或前两个字符 
    看起来-b选项和-c选项没什么区别嘛。。其实不然,若文件内容有汉字就可以看出来两者的差别了。
    三、
    
    你是不是有些疑惑:汉字不是占两个字节 么?cut -b 1-2 test1正好是显示两个字节呀。。不错,网上有很多资料都是这么说的,而且它们会告诉你用cut -b 1-3就可以完整的显示出一个汉字,原因是cut -b 1-2以字节为单位来处理,字符被“切成两半”,因此无法正常显示。
    但是看了下面的图片,你或许会有不同的看法: 
         呵呵。。实在不好意思,貌似从utf-8到gb2312的编码转换没有成功,但是没关系,这不影响我们对为什么cut -b 1-2不能正确显示汉字的判断。
    这个图片就可以说明-b和-c选项的差别:我们用cut -b 1-2 test1时,没有显示出汉字,但是换成-c选项则可以显示两个汉字。这就是-b(字节)和-c(字符)之间的区别。
    我们看到编码为utf-8的test1文件第一行一共有5个汉字和3个字母,但wc -c统计是19个字节,而编码为iso-8859的test文件统计为14个字节!(wc -c在统计字节时,结束符/换行符也作为一个字节。) 
        这表明:在utf-8编码下,汉字是占三个字节的!
    大家可自己动手试验一下,在utf-8编码下,用cut -b 1-3可以显示一个汉字,而在其它编码如gb2312、iso-8859等编码下,用cut -b 1-2就可以显示一个汉字。
    
    (二)、
    一.简单了解
    新建一个文件,命名为names,内容如下
        $cat names
        Farseer
        Tony
        Emanuel
        Lucy
        Jim
        ChenJihuang
        Jack
    假如我们要析取出第3个字符,就这样做
        $cut -c3 names 
        r
        n
        a
        c
        m
        e
        c
    如果要析取第3,5字符,就这样,用逗号隔开即可,如果不用
        $cut -c3,5 names 
        re
        n
        au
        c
        m
        eJ
        c
    如果是2到4这几个字符,就用连接号“-”
        $cut -c2-4 names 
        ars
        ony
        man
        ucy
        im
        hen
        ack
    自己感受理解一下“,”和“-”的作用,想一下如果去掉这些符号,上面的例子会输出什么。
    明白了吧,自己试一下才能有更深的体会!!
    二.过滤器作用
    过滤器,不用我讲也明白,就是过滤我们不要的东东,剩下我们要的。
    也许你看过这样的命令 $cat names | less
    如果你不明白 "|"是什么东东,你先记住这是一种写法,而“|”这个东东叫作管道,接下来会有解释
    为了体现过滤器作用,我们先用who(前一讲有介绍)查看一下
        $who
        farseer tty7         2008-04-07 12:19 (:0)
        farseer pts/0        2008-04-07 14:01 (:0.0)
        user     tty9         2008-04-07 12:34 (:20)
    如果你只是想要用户名,那现在岂不是很不爽,后面所时间真是多余的麻烦,这时候cut就起作用了
        $who | cut -c1-7 
        farseer
        farseer
        user
    最长的名字farseer也就只有7个字符,把前7个析取出来,短的也就跟着出来,多余的也只是空格,不影响阅读。
    当然,出来之后还可以排序$who | cut -c1-7 | sort
    如果要显示什么终端(第二列内容),那一样的道理
        $who |cut -c10-14
        tty7 
        pts/0
        tty9
    顺便排一下序,看一下效果 
        $who |cut -c10-14 | sort
        pts/0
        tty7 
        tty9 
    如果我只要用户名和日期以及日期后面的东西呢?其实也很简单,在{一.简单了解}中已经提到“,”的作用了,现在加强一下理解
        $who |cut -c1-7,22-
        farseer 2008-04-07 12:19 (:0)
        farseer 2008-04-07 14:01 (:0.0)
        user    2008-04-07 12:34 (:20)
    如果把1-7,22-掉换一下呢?
        $who |cut -c22-,1-7
        farseer 2008-04-07 12:19 (:0)
        farseer 2008-04-07 14:01 (:0.0)
        user    2008-04-07 12:34 (:20)
    可见,还是会按原文的顺序。
    至于这些数字22,1-7是怎么来的,很简单,自己数,或者试一下看看结果就确定了。
    到这里,应该对cut这个命令又较深了了解了吧,不过,还未结束。
    三.-d和-f选项
    要知道,我们的用户信息都保存在/etc/passwd这个文件里面,我们来看一下前10行
        $head /etc/passwd        #head就是显示文件前十行的命令
        root:x:0:0:root:/root:/bin/bash
        daemon:x:1:1:daemon:/usr/sbin:/bin/sh
        bin:x:2:2:bin:/bin:/bin/sh
        sys:x:3:3:sys:/dev:/bin/sh
        sync:x:4:65534:sync:/bin:/bin/sync
        games:x:5:60:games:/usr/games:/bin/sh
        man:x:6:12:man:/var/cache/man:/bin/sh
        lp:x:7:7:lp:/var/spool/lpd:/bin/sh
        mail:x:8:8:mail:/var/mail:/bin/sh
        news:x:9:9:news:/var/spool/news:/bin/sh
    如果我们要取出用户名的话,就有点难度了。因为按照前面讲的方法会有很多多余的字符出现。
    所以-d和-f选项派上了用场。因为发现有个特点,这些内容是用":"隔开的。
    格式:cut -ddchar -ffields file
    注释:dchar是分隔符号,fileds是分隔之后的段号
    看下面的例子就差不多理解了
    为了方便操作,我们把这前10行写到一个叫做pass的文本中,使用输出重定向">"
    就是把本来输出到屏幕的内容输出到指定的文件中,如果文件不存在就自动创建,">"这个符号很形象
        $head /etc/passwd > pass
        $cat pass
        root:x:0:0:root:/root:/bin/bash
        daemon:x:1:1:daemon:/usr/sbin:/bin/sh
        bin:x:2:2:bin:/bin:/bin/sh
        sys:x:3:3:sys:/dev:/bin/sh
        sync:x:4:65534:sync:/bin:/bin/sync
        games:x:5:60:games:/usr/games:/bin/sh
        man:x:6:12:man:/var/cache/man:/bin/sh
        lp:x:7:7:lp:/var/spool/lpd:/bin/sh
        mail:x:8:8:mail:/var/mail:/bin/sh
        news:x:9:9:news:/var/spool/news:/bin/sh
    好的,接下来是真正的例子。
        $cut -d: -f1 pass 
        root
        daemon
        bin
        sys
        sync
        games
        man
        lp
        mail
        news
    看到了吧,:就是分隔符号,1就是分隔后的第一段,也就是用户名
    这时候你应该产生一种思维,如果要第n断,只须修改f的参数即可。
    下面这一句是显示用户名和shell的路径(最后一段的内容)
        $cut -d: -f1,7 pass 
        root:/bin/bash
        daemon:/bin/sh
        bin:/bin/sh
        sys:/bin/sh
        sync:/bin/sync
        games:/bin/sh
        man:/bin/sh
        lp:/bin/sh
        mail:/bin/sh
        news:/bin/sh
    再一次看到了“,”的功能了吧
    同样的“-”也是可以用的,我就不举例了,你自己试试。
    再举一个例子,加入有个文件qq里面存放你好友的QQ,内容如下
        $cat qq
        Farseer 619932509
        Chen Jihuang    619932509
    名字和qq号使用制表符隔开(Tab键)。
    用下面命令可以查看(这个命令不用过分追究,我也不清楚)
        $sed -n l qq
        Farseer	619932509$
        Chen Jihuang	619932509$
    看到了吧,事实上,如果你用过c或者c++,就知道	转义为制表符
    这时候你执行
        $cut -f1 qq
        Farseer
        Chen Jihuang
    发现没有用-d选项,就可以分段了,为什么呢?
    因为默认分隔符号是制表符。
  • 相关阅读:
    eclipse tomcat插件
    eclipse.ini
    iBatis杂记
    oracle 10g express 下载网址
    免费ftp客户端 winscp
    maven web app 发布到Tomcat
    sqlserver获取本月最后一天
    ArrayCollection和ComboBox
    flex框架 Cairngorm
    HDU3420 Bus Fair
  • 原文地址:https://www.cnblogs.com/zendu/p/4987937.html
Copyright © 2020-2023  润新知