Linux之cut命令
cut命令说明
cut命令是一个常用的linux命令,它从文件的每一行剪切字节、字符和字段并将这些剪切出来的东西写到标准输出。它有一些常用的参数,先看两个:
-b:以字节为单位进行切割
-c:以字符为单位进行切割
先看看-b和-c的区别,如下:
[root@tk-dba-mysql ~]# cat test.txt abcdefg\abc abcdefg\abc hijklmn\xyz [root@tk-dba-mysql ~]# cat test.txt|cut -b 2 b b i
我们定义一个文件,里面写上上述内容,并使用cut -d的方法来取它的第2列的值,可以看到,取出了我们想要的内容b,b,i。如果我们在里面再写入一行中文,我们可以看到如下结果:
[root@tk-dba-mysql ~]# cat test.txt abcdefg\abc abcdefg\abc hijklmn\xyz 我是中国人 [root@tk-dba-mysql ~]# cat test.txt|cut -b 2 b b i
可以发现,最后一行的汉字没有出来,我们期望出现的汉字是'是'这个汉字,这是为什么呢?其实是因为我们采用的-b参数,它是使用字节作为单位进行分割的,而linux中如果采用utf8编码,那么1个汉字占用3个字节,所以我们就得不到自己期望的结果了,那怎么做呢?我们可以采用-c的方法,如下:
[root@tk-dba-mysql10-202 ~]# cat test.txt|cut -c 3 c c j 中 [root@tk-dba-mysql10-202 ~]# cat test.txt|cut -c 3-4,6 cdf cdf jkm 中国
可以看到,我们使用-c参数,就已经得到了想要的结果,上述第二个命令可以发现,最后面的列还可以使用范围值。再来看一个例子:
#第个字符到第个字符(包含第个字符) [root@tk-dba-mysql ~]# cat test.txt|cut -c -3 abc abc hij 我是中 #第个字符到最后一个字符(包含第个字符) [root@tk-dba-mysql ~]# cat test.txt|cut -c 3- cdefg\abc cdefg\abc jklmn\xyz 中国人 #第个字符到第个字符以及第个字符到最后一个字符(也就是所有字符,注意第个字符不重复) [root@tk-dba-mysql ~]# cat test.txt|cut -c -3,3- abcdefg\abc abcdefg\abc hijklmn\xyz 我是中国人 #颠倒着写,cut命令会自动进行排序 [root@tk-dba-mysql ~]# cat test.txt|cut -c 3-,-3 abcdefg\abc abcdefg\abc hijklmn\xyz 我是中国人 #重复写,不重复执行 [root@tk-dba-mysql ~]# cat test.txt|cut -c -3,-3 abc abc hij 我是中
我们再来看另外两个参数:
-d:分隔符
-f:域,和-d一般连着用
废话不多说,直接看例子:
[root@tk-dba-mysql ~]# cat /etc/passwd|head -n 5 root:x:::root:/root:/bin/bash bin:x:::bin:/bin:/sbin/nologin daemon:x:::daemon:/sbin:/sbin/nologin adm:x:::adm:/var/adm:/sbin/nologin sync:x:::sync:/sbin:/bin/sync [root@tk-dba-mysql ~]# cat /etc/passwd|head -n 5|cut -d : -f 1 root bin daemon adm sync
我们先打印出来/etc/passwd里面的前5行,然后通过cut -d : 来指明使用冒号作为分隔符,然后-f是选择冒号分割后的第几列,这里我们选择第一列,也就成了上面的结果。再来看例子:
[root@tk-dba-mysql10-202 ~]# cat test.txt abcdefg\abc abcdefg\abc hijklmn\xyz 我是中国人 [root@tk-dba-mysql10-202 ~]# cat test.txt|cut -d e -f 1 abcd abcd hijklmn\xyz 我是中国人 [root@tk-dba-mysql10-202 ~]# cat test.txt|cut -d e -f 2 fg\abc fg\abc hijklmn\xyz 我是中国人
我们用字母e作为分割符号,然后在-f参数后面选择第1部分还是第2部分,需要注意的是,由于后面两行"hijklmn\xyz"和"我是中国人"都不包含字母e,所以都被完整的保留了下来。
-n参数,告诉cut不要将多个字符分开来,一般和-b一起使用,如下:
[root@tk-dba-mysql10-202 ~]# cat test.txt 我是中国人 我是中国人 我是中国人 我是中国人 [root@tk-dba-mysql10-202 ~]# cat test.txt | cut -nb 1,2,3 我 我 我 我 [root@tk-dba-mysql10-202 ~]# cat test.txt | cut -nb 4,5,6 是 是 是 是 [root@tk-dba-mysql10-202 ~]# cat test.txt | cut -nb 7,8,9 中 中 中 中 [root@tk-dba-mysql10-202 ~]# cat test.txt | cut -nb 5,6,7,8,9 是中 是中 是中 是中
上面的例子可以看出,一个汉字是由三个字节构成的,我们想要打印对应的汉字,最好的方法是使用-nb的参数,把他对应的字节给打印出来,除此之外,还可以使用最后一种,打印出它的字节范围,这个范围中只要包含最后一个字节,那么这个汉字就能被显示出来。例如要打印出"我"这个汉字,给定的范围中就必须包含3这个字节,要打印出"是",给定的范围就必须包含6这个字节,以此类推。