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\t619932509$
    Chen Jihuang\t619932509$
看到了吧,事实上,如果你用过c或者c++,就知道\t转义为制表符
这时候你执行
    $cut -f1 qq
    Farseer
    Chen Jihuang
发现没有用-d选项,就可以分段了,为什么呢?
因为默认分隔符号是制表符。
时间: 2024-11-06 07:24:58

linux命令学习笔记:cut详解的相关文章

Linux命令学习笔记目录

Linux命令学习笔记目录 最近正在使用,linux,顺便将用到的命令整理了一下. 一. 文件目录操作命令: 0.linux命令学习笔记(0):man 命令 1.linux命令学习笔记(1):ls命令 2.linux命令学习笔记(2):cd命令 3.linux命令学习笔记(3):pwd命令 4.linux命令学习笔记(4):mkdir命令 5.linux命令学习笔记(5):rm 命令 6.linux命令学习笔记(6):rmdir 命令 7.linux命令学习笔记(7):mv命令 8.linux命

后缀数组学习笔记【详解|图】

后缀数组学习笔记[详解] 老天,一个后缀数组不知道看了多少天,最后终于还是看懂了啊! 最关键的就是一会儿下标表示排名,一会用数值表示排名绕死人了. 我不知道手跑了多少次才明白过来.其实我也建议初学者手跑几遍,但是一定要注意数组的意义,否则就是无用功. 数组含义: s[ ]:输入的字符串,预处理的时候会在末尾加上一个0 sa[ ]:它的下标就是后缀排名 x[ ] = t[ ]:用来保存第一关键字排名,注意!它的数值是排名.初始时恰好是字符串的ASCII码.字典序嘛! y[ ] = t2[ ]:它的

linux命令学习笔记-持续更新版

shell 获取前一条命令是否执行成功 if [ $? -eq 0 ];then   echo "success" fi linux命令学习笔记-持续更新版

(转)Linux命令之Ethtool用法详解

Linux命令之Ethtool用法详解 原文:http://www.linuxidc.com/Linux/2012-01/52669.htm Linux/Unix命令之Ethtool描述:Ethtool是用于查询及设置网卡参数的命令.概要:ethtool ethX      //查询ethX网口基本设置ethtool –h        //显示ethtool的命令帮助(help)ethtool –i ethX    //查询ethX网口的相关信息 ethtool –d ethX    //查询

Linux命令学习笔记1

1.Linux命令学习 2.Mkdir /data       -创建文件夹 在/下创建文件夹 data 3.Cd               -目录切换 列如cd / 4.Touch /data/1.txt  -创建当前目录下文件 5.vi /data/1.txt     -编辑器编辑当前文件 i -进入编辑模式  esc键退出编辑模式  :wq -保存 6.vim /data/1.txt    -高级编辑器 7.cat /data/1.txt     -查看文件 -特殊用法: cat >>

linux命令学习笔记(50):crontab命令

前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令. 一.crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似, 当安装完成操作

linux命令学习笔记

操作文件和目录: copy: $ cp file1 file2 $ cp -r dir1 dir2 move: $ mv file .. $ mv file dir/ rename: $ mv file1 file2 $ mv dir1 dir2 # dir2如果存在,则为移动操作 remove: $ rm file $ rm -r dir 创建文件: $ touch a.txt $ >a.txt 创建目录: $ mkdir dir 查看文件: #一般 $ cat file #查看文件类型: $

linux命令学习笔记(20):find命令之exec

find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作, 这个时候exec的作用就显现出来了. exec解释: -exec 参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的, 考虑到各个系统中分号会有不同的意义,所以前面加反斜杠. {} 花括号代表前面find查找出来的文件名. 使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的.在有些操作系统中 只允许-ex

linux命令学习笔记(22):find 命令的参数详解

find一些常用参数的一些常用实例和一些具体用法和注意事项. 1.使用name选项: 文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用. 可以使用某种文件名 模式来匹配文件,记住要用引号将文件名模式引起来. 不管当前路径是什么,如果想要在自己的根目录$HOME中 查找文件名符合*.log的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录. find ~ -name "*.log" -print 想要在当前目录及子目录中查找所有