Linux cut 命令详解
cut命令在Linux和Unix中的作用是从文件中的每一行中截取出一些部分,并输出到标准输出中。我们可以使用cut命令从一行字符串中于以字节,字符,字段(分隔符)等单位截取一部分内容出来。
在本文中,我们通过一些例子来了解cut命令的使用,这些使用方法在我们的日常工作中也是非常常用的。
Cut命令和语法
cut命令的基本语法如下:
$cutOPTION...[FILE]...
我们先来了解一下cut的一些选项,cut命令必须要指定选项才能执行。
-f:提取指定的字段,cut命令使用Tab作为默认的分隔符。
-d:Tab是默认的分隔符,使用这一选项可以指定自己的分隔符。
-b:提取指定的字节,也可以指定一个范围。
-c:提取指定的字符,可以是以逗号分隔的数字的列表,也可以是以连字符分隔的数字的范围。
–complement:补充选中的部分,即反选。
–output-delimiter:修改输出时使用的分隔符。
--only-delimited:不输出不包含分隔符的列。
我们以如下的名为context.txt的文本文件和/etc/passwd文件来为例来进行说明。
$catcontent.txt UbuntuLinux MicrosoftWindows OsXElCapitan Unix FreeBSD
如何指定分隔符
最常用的选项是-d和-f的组合,这会根据-d指定的分隔符和-f列出的字段来提取内容。
例如在这个例子中只打印出/etc/passwd文件每一行的第一个字段,用的分隔符是:
$cut-d':'-f1/etc/passwd root bin daemon adm lp sync shutdown halt mail operator games alvin liangxu ...
在下面这个例子中我们用空格作为分隔符打印content.txt文件的第一个字段
$cut-d""-f1content.txt Ubuntu Microsoft OsX Unix FreeBSD
在下面这个例子中我们提取了多个字段。这里,我们使用冒号(:)分隔符从文件/etc/passwd中包含字符串/bin/bash的行提取第一和第六个字段。
$grep"/bin/bash"/etc/passwd|cut-d':'-f1,6 root:/root alvin:/home/alvin
要显示字段的某个范围,可以指定开始和结束的字段,中间用连字符(-)连接,如下所示:
$grep"/bin/bash"/etc/passwd|cut-d':'-f1-4,6,7 root:x:0:0:/root:/bin/bash alvin:x:1000:1000:/home/alvin:/bin/bash
如何补全选择的输出
要补全选择输出的字段(即反选),使用--complement选项。这一选项输出所有的字段,除了指定的字段。
在下面这个例子中输出/etc/passwd文件中包含/bin/bash的行中除了第二个字段以外的所有字段:
$grep"/bin/bash"/etc/passwd|cut-d':'--complement-f2 root:0:0:root:/root:/bin/bash
如何指定输出的分隔符
使用--output-delimiter可以指定输出的分隔符。输入的分隔符由-d来指定,而输出分隔符和输入分隔符默认是一样的。
我们先以下面的例子来测试不指定输出分隔符时的输出;
$cut-d:-f1,7/etc/passwd|sort|uniq-u _apt:/usr/sbin/nologin backup:/usr/sbin/nologin bin:/usr/sbin/nologin daemon:/usr/sbin/nologin dnsmasq:/usr/sbin/nologin games:/usr/sbin/nologin gnats:/usr/sbin/nologin irc:/usr/sbin/nologin landscape:/usr/sbin/nologin list:/usr/sbin/nologin lp:/usr/sbin/nologin lxd:/bin/false
现在我们加上--output-delimiter选项,将输出分隔符指定为空格:
$cut-d:-f1,7--output-delimiter''/etc/passwd|sort|uniq-u _apt/usr/sbin/nologin backup/usr/sbin/nologin bin/usr/sbin/nologin daemon/usr/sbin/nologin dnsmasq/usr/sbin/nologin games/usr/sbin/nologin gnats/usr/sbin/nologin irc/usr/sbin/nologin landscape/usr/sbin/nologin list/usr/sbin/nologin lp/usr/sbin/nologin lxd/bin/false
我们再测试一个例子,用分隔符让每一行打印一个字段。
我们将--output-delimiter指定为$'\n'表换行。
输出结果为:
$greproot/etc/passwd|cut-d':'-f1,6,7--output-delimiter=$'\n'
root
/root
/bin/bash
operator
/root
/sbin/nologin
如何以字符的方式提取内容
-c选项可以用来根据字符位置进行提取,注意空格和Tab也以字符来处理。
打印context.txt文件每一行的第一个字符,如下:
$cut-c1content.txt U M O U F
下面显示了context.txt文件每一行的第一至七个字符;
$cut-c1-7content.txt Ubuntu Microso OsXEl Unix FreeBSD
我们再测试一下只指定开始或结束的位置。
下面提取第二个到最后一个字符:
$cut-c2-content.txt buntuLinux icrosoftWindows sXElCapitan nix reeBSD
提取第一到第四个字符:
cut-c-4content.txt Ubun Micr OsX Unix Free
如何根据字节提取
使用-b选项通过指定字节的位置来选择一行的某一部分,使用逗号分隔每个指定位置,或用连字符-指定一个范围。
下面这个例子提取content.txt文件每一行的第一,二,三个字节:
$cut-b1,2,3content.txt Ubu Mic OsX Uni Fre
我们也可以用如下命令列出一个范围;
$cut-b1-3,5-7content.txt Ubutu Micoso OsXEl Uni FreBSD
一些实用的例子
cut是一个实用的命令,常常和其他Linux或Unix命令结合使用。
例如如果你想提取ps命令中的USER,PID和COMMAND:
ps-Lun|tr-s""|cut-d""-f2,3,14- USERPIDCOMMAND 0676/sbin/agetty-o-p--\u--keep-baud115200,38400,9600ttyS0vt220 0681/sbin/agetty-o-p--\u--nocleartty1linux 023174-bash 026737ps-Lun 026738tr-s 026739cut-d-f2,3,14-
再测试一个例子,提取内存的total,used和free值,并保存到一个文件中。
$free-m|tr-s''|sed'/^Mem/!d'|cut-d""-f2-4>>memory.txt $catmemory.txt 98586234
总结
cut命令可以和很多其他Linux或Unix命令通过管道连接。可以通过管道传递一个或多个过滤器进行额外的文本处理。
cut命令的局限性之一是它不支持指定多个字符作为分隔符。多个空格会被计算为多个字段分隔符,因此必须在cut命令前使用tr命令才能获得需要的输出。
到此这篇关于Linuxcut命令详解的文章就介绍到这了,更多相关Linuxcut命令内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!