cut命令在Linux和Unix中的作用是从文件中的每一行中截取出一些部份linux剪切命令,并输出到标准输出中。我们可以使用cut命令从一行字符串中于以字节,字符,数组(分隔符)等单位截取一部份内容下来。
在本文中,我们通过一些事例来了解cut命令的使用,这种使用方式在我们的日常工作中也是十分常用的。
Cut命令和句型
cut命令的基本句型如下:
$cutOPTION……
我们先来了解一下cut的一些选项,cut命令必需要指定选项才会执行。
-f:提取指定的数组,cut命令使用Tab作为默认的分隔符。
-d:Tab是默认的分隔符,使用这一选项可以指定自己的分隔符。
-b:提取指定的字节linux安全加固,也可以指定一个范围。
-c:提取指定的字符,可以是以冒号分隔的数字的列表,也可以是以连字符分隔的数字的范围。
–complement:补充选中的部份,即反选。
–output-delimiter:更改输出时使用的分隔符。
--only-delimited:不输出不包含分隔符的列。
我们以如下的名为context.txt的文本文件和/etc/passwd文件来为例来进行说明。
$catcontent.txtUbuntuLinuxMicrosoftWindowsOsXElCapitanUnixFreeBSD
怎么指定分隔符
最常用的选项是-d和-f的组合,这会按照-d指定的分隔符和-f列举的数组来提取内容。
比如在这个反例中只复印出/etc/passwd文件每一行的第一个数组linux 下载,用的分隔符是:
$cut-d’:’-f1/etc/passwdrootbindaemonadmlpsyncshutdownhaltmailoperatorgamesalvinliangxu…
在下边这个反例中我们用空格作为分隔符复印content.txt文件的第一个数组
$cut-d””-f1content.txtUbuntuMicrosoftOsXUnixFreeBSD
在下边这个反例中我们提取了多个数组。这儿,我们使用逗号(:)分隔符从文件/etc/passwd中包含字符串/bin/bash的行提取第一和第六个数组。
$grep”/bin/bash”/etc/passwd|cut-d’:’-f1,6root:/rootalvin:/home/alvin
要显示数组的某个范围,可以指定开始和结束的数组,中间用连字符(-)联接,如下所示:
$grep”/bin/bash”/etc/passwd|cut-d’:’-f1-4,6,7root:x:0:0:/root:/bin/bashalvin:x:1000:1000:/home/alvin:/bin/bash
怎么补全选择的输出
要补全选择输出的数组(即反选),使用--complement选项。这一选项输出所有的数组,不仅指定的数组。
在下边这个反例中输出/etc/passwd文件中包含/bin/bash的行中不仅第二个数组以外的所有数组:
$grep”/bin/bash”/etc/passwd|cut-d’:’--complement-f2root:0:0:root:/root:/bin/bash
怎么指定输出的分隔符
使用--output-delimiter可以指定输出的分隔符。输入的分隔符由-d来指定,而输出分隔符和输入分隔符默认是一样的。
我们先以下边的反例来测试不指定输出分隔符时的输出;
$cut-d:-f1,7/etc/passwd|sort|uniq-u_apt:/usr/sbin/nologinbackup:/usr/sbin/nologinbin:/usr/sbin/nologindaemon:/usr/sbin/nologindnsmasq:/usr/sbin/nologingames:/usr/sbin/nologingnats:/usr/sbin/nologinirc:/usr/sbin/nologinlandscape:/usr/sbin/nologinlist:/usr/sbin/nologinlp:/usr/sbin/nologinlxd:/bin/false
如今我们加上--output-delimiter选项,将输出分隔符指定为空格:
$cut-d:-f1,7--output-delimiter”/etc/passwd|sort|uniq-u_apt/usr/sbin/nologinbackup/usr/sbin/nologinbin/usr/sbin/nologindaemon/usr/sbin/nologindnsmasq/usr/sbin/nologingames/usr/sbin/nologingnats/usr/sbin/nologinirc/usr/sbin/nologinlandscape/usr/sbin/nologinlist/usr/sbin/nologinlp/usr/sbin/nologinlxd/bin/false
我们再测试一个反例,用分隔符让每一行复印一个数组。
我们将--output-delimiter指定为$’n’表换行。
输出结果为:
$greproot/etc/passwd|cut-d’:’-f1,6,7--output-delimiter=$’n’root/root/bin/bashoperator/root/sbin/nologin
如何以字符的方法提取内容
-c选项可以拿来按照字符位置进行提取,注意空格和Tab也以字符来处理。
复印context.txt文件每一行的第一个字符,如下:
$cut-c1content.txtUMOUF
下边显示了context.txt文件每一行的第一至七个字符;
$cut-c1-7content.txtUbuntuMicrosoOsXElUnixFreeBSD
我们再测试一下只指定开始或结束的位置。
下边提取第二个到最后一个字符:
$cut-c2-content.txtbuntuLinuxicrosoftWindowssXElCapitannixreeBSD
提取第一到第四个字符:
cut-c-4content.txtUbunMicrOsXUnixFree
怎么按照字节提取
使用-b选项通过指定字节的位置来选择一行的某一部份,使用冒号分隔每位指定位置,或用连字符-指定一个范围。
下边这个事例提取content.txt文件每一行的第一,二,三个字节:
$cut-b1,2,3content.txtUbuMicOsXUniFre
我们也可以用如下命令列举一个范围;
$cut-b1-3,5-7content.txtUbutuMicosoOsXElUniFreBSD
一些实用的事例
cut是一个实用的命令,经常和其他Linux或Unix命令结合使用。
比如假如你想提取ps命令中的USERlinux剪切命令,PID和COMMAND:
ps-Lun|tr-s””|cut-d””-f2,3,14-USERPIDCOMMAND0676/sbin/agetty-o-p--u--keep-baud115200,38400,9600ttyS0vt2200681/sbin/agetty-o-p--u--nocleartty1linux023174-bash026737ps-Lun026738tr-s026739cut-d-f2,3,14-
再测试一个反例,提取显存的total,used和free值,并保存到一个文件中。
$free-m|tr-s”|sed’/^Mem/!d’|cut-d””-f2-4>>memory.txt$catmemory.txt98586234
总结
cut命令可以和好多其他Linux或Unix命令通过管路联接。可以通过管路传递一个或多个过滤器进行额外的文本处理。
cut命令的局限性之一是它不支持指定多个字符作为分隔符。多个空格会被估算为多个数组分隔符,因而必须在cut命令前使用tr命令能够获得须要的输出。