你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

通过一些例子来了解 cut 命令的使用

[复制链接]
gaosmile 发布时间:2020-7-21 19:51

cut 命令在Linux和Unix中的作用是从文件中的每一行中截取出一些部分,并输出到标准输出中。我们可以使用 cut 命令从一行字符串中于以字节,字符,字段(分隔符)等单位截取一部分内容出来。

在本文中,我们通过一些例子来了解 cut 命令的使用,这些使用方法在我们的日常工作中也是非常常用的。


Cut 命令和语法



cut 命令的基本语法如下:

  1. <font color="black">
  2. $ cut OPTION... [FILE]...</font>
复制代码


我们先来了解一下 cut 的一些选项,cut 命令必须要指定选项才能执行。

-f : 提取指定的字段,cut 命令使用 Tab 作为默认的分隔符。

-d : Tab 是默认的分隔符,使用这一选项可以指定自己的分隔符。

-b : 提取指定的字节,也可以指定一个范围。

-c : 提取指定的字符,可以是以逗号分隔的数字的列表,也可以是以连字符分隔的数字的范围。

–complement : 补充选中的部分,即反选。

–output-delimiter : 修改输出时使用的分隔符。

--only-delimited : 不输出不包含分隔符的列。

我们以如下的名为 context.txt 的文本文件和 /etc/passwd 文件来为例来进行说明。


  1. $ cat content.txt
  2. Ubuntu Linux
  3. Microsoft Windows
  4. OsX El Capitan
  5. Unix
  6. FreeBSD
复制代码


如何指定分隔符



最常用的选项是 -d 和 -f 的组合,这会根据 -d 指定的分隔符和 -f 列出的字段来提取内容。

例如在这个例子中只打印出 /etc/passwd 文件每一行的第一个字段,用的分隔符是 :

  1. <font color="black">
  2. $ cut -d':' -f1 /etc/passwd
  3. root
  4. bin
  5. daemon
  6. adm
  7. lp
  8. sync
  9. shutdown
  10. halt
  11. mail
  12. operator
  13. games
  14. alvin
  15. liangxu
  16. ...</font>
复制代码


在下面这个例子中我们用空格作为分隔符打印 content.txt 文件的第一个字段

  1. <font color="black">
  2. $ cut -d " " -f 1 content.txt
  3. Ubuntu
  4. Microsoft
  5. OsX
  6. Unix
  7. FreeBSD</font>
复制代码


在下面这个例子中我们提取了多个字段。这里,我们使用冒号(:)分隔符从文件 /etc/passwd 中包含字符串 /bin/bash 的行提取第一和第六个字段。

  1. <font color="black">
  2. $ grep "/bin/bash" /etc/passwd | cut -d':' -f1,6
  3. root:/root
  4. alvin:/home/alvin</font>
复制代码


要显示字段的某个范围,可以指定开始和结束的字段,中间用连字符(-)连接,如下所示:

  1. <font color="black">
  2. $ grep "/bin/bash" /etc/passwd | cut -d':' -f1-4,6,7
  3. root:x:0:0:/root:/bin/bash
  4. alvin:x:1000:1000:/home/alvin:/bin/bash</font>
复制代码



如何补全选择的输出



要补全选择输出的字段(即反选),使用 --complement 选项。这一选项输出所有的字段,除了指定的字段。

在下面这个例子中输出 /etc/passwd 文件中包含 /bin/bash 的行中除了第二个字段以外的所有字段:

  1. <font color="black">
  2. $ grep "/bin/bash" /etc/passwd | cut -d':' --complement -f2
  3. root:0:0:root:/root:/bin/bash</font>
复制代码



如何指定输出的分隔符



使用 --output-delimiter 可以指定输出的分隔符。输入的分隔符由 -d 来指定,而输出分隔符和输入分隔符默认是一样的。

我们先以下面的例子来测试不指定输出分隔符时的输出;

  1. <font color="black">
  2. $  cut -d: -f1,7  /etc/passwd |  sort |  uniq -u
  3. _apt:/usr/sbin/nologin
  4. backup:/usr/sbin/nologin
  5. bin:/usr/sbin/nologin
  6. daemon:/usr/sbin/nologin
  7. dnsmasq:/usr/sbin/nologin
  8. games:/usr/sbin/nologin
  9. gnats:/usr/sbin/nologin
  10. irc:/usr/sbin/nologin
  11. landscape:/usr/sbin/nologin
  12. list:/usr/sbin/nologin
  13. lp:/usr/sbin/nologin
  14. lxd:/bin/false</font>
复制代码


现在我们加上--output-delimiter选项,将输出分隔符指定为空格:

  1. <font color="black">
  2. $  cut -d: -f1,7 --output-delimiter ' ' /etc/passwd |  sort |  uniq -u
  3. _apt /usr/sbin/nologin
  4. backup /usr/sbin/nologin
  5. bin /usr/sbin/nologin
  6. daemon /usr/sbin/nologin
  7. dnsmasq /usr/sbin/nologin
  8. games /usr/sbin/nologin
  9. gnats /usr/sbin/nologin
  10. irc /usr/sbin/nologin
  11. landscape /usr/sbin/nologin
  12. list /usr/sbin/nologin
  13. lp /usr/sbin/nologin
  14. lxd /bin/false</font>
复制代码


我们再测试一个例子,用分隔符让每一行打印一个字段。

我们将 --output-delimiter 指定为 $'\n' 表换行。

输出结果为:


  1. $ grep root /etc/passwd | cut -d':' -f1,6,7 --output-delimiter=[/color][/font][/backcolor][p=26, null, left][backcolor=rgb(255, 255, 255)][font=Tahoma][color=black]
  2. [/color][/font][/backcolor]
  3. [/p][align=left][backcolor=rgb(255, 255, 255)]
  4. [/backcolor][/align][p=23, null, left][font=Tahoma][color=black]如何以字符的方式提取内容[/color][/font][/p]
  5. [align=left][backcolor=rgb(255, 255, 255)]
  6. [/backcolor][/align][p=26, null, left][backcolor=rgb(255, 255, 255)][font=Tahoma][color=black]-c选项可以用来根据字符位置进行提取,注意空格和Tab也以字符来处理。[/color][/font][/backcolor][/p][p=26, null, left][backcolor=rgb(255, 255, 255)][font=Tahoma][color=black]打印 context.txt 文件每一行的第一个字符,如下:[/color][/font][/backcolor][/p][code]<font style="background-color:rgb(255, 255, 255)"><font color="black" face="Tahoma">
  7. $ cut -c 1 content.txt
  8. U
  9. M
  10. O
  11. U
  12. F</font></font>
复制代码

下面显示了 context.txt 文件每一行的第一至七个字符;


  1. $ cut -c 1-7 content.txt
  2. Ubuntu
  3. Microso
  4. OsX El
  5. Unix
  6. FreeBSD
复制代码


我们再测试一下只指定开始或结束的位置。

下面提取第二个到最后一个字符:

  1. <font color="black">
  2. $ cut -c2- content.txt
  3. buntu Linux
  4. icrosoft Windows
  5. sX El Capitan
  6. nix
  7. reeBSD</font>
复制代码


提取第一到第四个字符:


  1. cut -c-4 content.txt
  2. Ubun
  3. Micr
  4. OsX
  5. Unix
  6. Free
复制代码




如何根据字节提取



使用-b选项通过指定字节的位置来选择一行的某一部分,使用逗号分隔每个指定位置,或用连字符 - 指定一个范围。

下面这个例子提取 content.txt 文件每一行的第一,二,三个字节:

  1. <font color="black">
  2. $ cut -b 1,2,3 content.txt
  3. Ubu
  4. Mic
  5. OsX
  6. Uni
  7. Fre</font>
复制代码


我们也可以用如下命令列出一个范围;

  1. <font color="black">
  2. $ cut -b 1-3,5-7 content.txt
  3. Ubutu
  4. Micoso
  5. OsXEl
  6. Uni
  7. FreBSD</font>
复制代码



一些实用的例子



cut 是一个实用的命令,常常和其他Linux或Unix命令结合使用 。

例如如果你想提取 ps 命令中的 USER,PID和COMMAND:

  1. <font color="black">
  2. ps -L u n | tr -s " " | cut -d " " -f 2,3,14-
  3. USER PID COMMAND
  4. 0 676 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9600 ttyS0 vt220
  5. 0 681 /sbin/agetty -o -p -- \u --noclear tty1 linux
  6. 0 23174 -bash
  7. 0 26737 ps -L u n
  8. 0 26738 tr -s
  9. 0 26739 cut -d -f 2,3,14-</font>
复制代码


再测试一个例子,提取内存的 total,used和free值,并保存到一个文件中。

  1. <font color="black">
  2. $ free -m | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2-4 >> memory.txt
  3. $ cat memory.txt
  4. 985 86 234</font>
复制代码



总结



cut 命令可以和很多其他Linux或Unix命令通过管道连接。可以通过管道传递一个或多个过滤器进行额外的文本处理。

cut 命令的局限性之一是它不支持指定多个字符作为分隔符。多个空格会被计算为多个字段分隔符,因此必须在 cut 命令前使用 tr 命令才能获得需要的输出。


\n'
root
/root
/bin/bash
operator
/root
/sbin/nologin[/code]




如何以字符的方式提取内容



-c选项可以用来根据字符位置进行提取,注意空格和Tab也以字符来处理。

打印 context.txt 文件每一行的第一个字符,如下:

  1. <font style="background-color:rgb(255, 255, 255)"><font color="black" face="Tahoma">
  2. $ cut -c 1 content.txt
  3. U
  4. M
  5. O
  6. U
  7. F</font></font>
复制代码

下面显示了 context.txt 文件每一行的第一至七个字符;


  1. $ cut -c 1-7 content.txt
  2. Ubuntu
  3. Microso
  4. OsX El
  5. Unix
  6. FreeBSD
复制代码


我们再测试一下只指定开始或结束的位置。

下面提取第二个到最后一个字符:

  1. <font color="black">
  2. $ cut -c2- content.txt
  3. buntu Linux
  4. icrosoft Windows
  5. sX El Capitan
  6. nix
  7. reeBSD</font>
复制代码


提取第一到第四个字符:


  1. cut -c-4 content.txt
  2. Ubun
  3. Micr
  4. OsX
  5. Unix
  6. Free
复制代码




如何根据字节提取



使用-b选项通过指定字节的位置来选择一行的某一部分,使用逗号分隔每个指定位置,或用连字符 - 指定一个范围。

下面这个例子提取 content.txt 文件每一行的第一,二,三个字节:

  1. <font color="black">
  2. $ cut -b 1,2,3 content.txt
  3. Ubu
  4. Mic
  5. OsX
  6. Uni
  7. Fre</font>
复制代码


我们也可以用如下命令列出一个范围;

  1. <font color="black">
  2. $ cut -b 1-3,5-7 content.txt
  3. Ubutu
  4. Micoso
  5. OsXEl
  6. Uni
  7. FreBSD</font>
复制代码



一些实用的例子



cut 是一个实用的命令,常常和其他Linux或Unix命令结合使用 。

例如如果你想提取 ps 命令中的 USER,PID和COMMAND:

  1. <font color="black">
  2. ps -L u n | tr -s " " | cut -d " " -f 2,3,14-
  3. USER PID COMMAND
  4. 0 676 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9600 ttyS0 vt220
  5. 0 681 /sbin/agetty -o -p -- \u --noclear tty1 linux
  6. 0 23174 -bash
  7. 0 26737 ps -L u n
  8. 0 26738 tr -s
  9. 0 26739 cut -d -f 2,3,14-</font>
复制代码


再测试一个例子,提取内存的 total,used和free值,并保存到一个文件中。

  1. <font color="black">
  2. $ free -m | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2-4 &gt;&gt; memory.txt
  3. $ cat memory.txt
  4. 985 86 234</font>
复制代码



总结



cut 命令可以和很多其他Linux或Unix命令通过管道连接。可以通过管道传递一个或多个过滤器进行额外的文本处理。

cut 命令的局限性之一是它不支持指定多个字符作为分隔符。多个空格会被计算为多个字段分隔符,因此必须在 cut 命令前使用 tr 命令才能获得需要的输出。


收藏 评论1 发布时间:2020-7-21 19:51

举报

1个回答
likang1202 回答时间:2020-7-22 08:53:43
顶一下
mark.png

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版