cut命令在Linux和Unix中是从文件中的每一行截取一些部分输出到标准输出。我们可以使用剪切命令,从一行字符串中剪切出以字节、字符、字段(分隔符)等为单位的一部分内容。在这篇文章中,我们通过一些例子来了解cut命令的使用,这个命令在我们的日常工作中也是很常用的。剪切命令及语法剪切命令的基本语法如下:$cutOPTION...[FILE]...让我们先了解一下剪切的一些选项。cut命令在执行前必须指定选项。-f:提取指定字段,cut命令默认使用Tab作为分隔符。-d:Tab是默认的分隔符,使用这个选项可以指定你自己的分隔符。-b:提取指定字节,也可以指定一个范围。-c:提取指定的字符,可以是逗号分隔的数字列表,也可以是连字符分隔的数字范围。--complement:对选中的部分进行补充,即反选。--output-delimiter:修改输出时使用的分隔符。--only-delimited:不输出不包含分隔符的列。下面以名为context.txt的文本文件和/etc/passwd文件为例进行说明。$catcontent.txtUbuntuLinuxMicrosoftWindowsOsXElCapitanUnixFreeBSD如何指定分隔符最常见的选项是-d和-f的组合,它会根据-d指定的分隔符和-f列出的字段提取内容。例如本例只打印/etc/passwd文件每一行的第一个字段,使用的分隔符为:$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要显示一定范围的字段,可以指定开始和结束字段,用a链接在中间字符(-)连接,如下:$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选项。此选项输出除指定字段之外的所有字段。在以下示例中,输出包含/bin/bash的/etc/passwd文件中的所有字段,除了第二个字段$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选项可用于根据字符位置提取内容。请注意,空格和制表符也被作为字符处理。打印context.txt文件每一行的第一个字符,如下:$cut-c1content.txtUMOUF下面显示context.txt文件每一行的前到七个字符;$cut-c1-7content.txtUbuntuMicrosoOsXElUnixFreeBSD我们再测试一下只指定开始或结束位置。下面提取倒数第??二个字符:$cut-c2-content.txtbuntuLinuxmicrosoftWindowsXElCapitannixreeBSD提取第一个到第四个字符:cut-c-4content.txtUbunMicrOsXUnixFree如何按字节提取使用-b选项指定字节位置要选择一行的一部分,请使用逗号分隔每个指定位置,或使用连字符-指定范围。以下示例提取content.txt文件每一行的第一个、第二个和第三个字节:$cut-b1,2,3content.txtUbuMicOsXUniFre我们还可以使用以下命令列出一个范围;$cut-b1-3,5-7content.txtUbutuMicosoOsXElUniFreBSD一些有用的例子cut是一个有用的命令,通常与其他Linux或Unix命令结合使用。例如,如果要在ps命令中提取USER、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命令以获得所需的输出。
