做者 | WenasWeihtml
将每一个文件中选定的行部分打印到标准输出, 若是没有文件,或者文件是-,则读取标准输入,长选项的强制参数对于短选项也是强制的。node
cut 是一个选取命令,通常来讲,选取信息一般是针对“行”来进行分析的,并非整篇信息分析的,用于显示每行从开头算起 num1 到 num2 的文字。linux
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。ubuntu
若是不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一, cut 默认以制表符为分隔符。bash
参数:服务器
在 -b、-c 或 -f 中只能使用一个。每一个LIST由一个组成
范围,或用逗号分隔的多个范围。选定的输入被写入
顺序与读取和写入的顺序相同。app
cut 命令主要是接受三个定位方法:测试
执行命令查询帮助文档:ui
cut --help
cut帮助文档解析:spa
'--bytes =字节列表'
选择仅打印字节列表中列出的位置中的 字节。制表符和退格键与其余任何字符同样;他们占用了1个字节。若是指定了输出定界符,而后在所选字节范围之间输出该字符串。
'--characters =字符列表'
选择仅打印在 character-list 中列出的位置中的 字符。目前与 -b 相同,可是国际化将改变这种情况。制表符和退格键与其余任何字符同样;他们占1个字符。若是指定了输出定界符,而后在所选字节范围之间输出该字符串。
'--delimiter = input_delim_byte'
和 -F,请使用 input_delim_byte 的第一个字节做为输入字段分隔符(默认为TAB)。
'--fields =字段列表'
选择仅打印在 field-list 中列出的字段。默认状况下,字段之间用TAB字符分隔。还要打印任何不包含定界符的行,除非 -仅定界 (-s)选项已指定。
不要拆分多字节字符。
'-仅定界'
为了 -F,请勿打印不包含字段分隔符的行。一般,任何没有字段分隔符的行都按原样打印。
当你执行 who 命令时,会输出相似以下的内容:
$ who root pts/1 2021-04-25 21:51 (58.62.93.183) root pts/0 2021-04-25 21:50 (58.62.93.183)
$ who|cut -b 3 o o
方案1:
$ who |cut -b 1-3 roo roo roo
方案2:
$ who |cut -b 1,2,3 roo roo roo
-b 支持形如 1-3 的写法,并且多个定位之间用逗号隔开就能够了。
注意:
cut 命令若是使用了-b选项,那么执行此命令时,cut 会先把 -b 后面全部的定位进行从小到大排序,而后再提取。不能颠倒定位的顺序。
who|cut -b 1-3,20- roo 2021-04-25 21:51 (58.62.93.183) roo 2021-04-25 21:50 (58.62.93.183) roo 2021-04-25 23:05 (58.62.93.183)
n = 2 的状况下
方案1:
$ who |cut -b 2- oot pts/1 2021-04-25 21:51 (58.62.93.183) oot pts/0 2021-04-25 21:50 (58.62.93.183) oot pts/2 2021-04-25 23:05 (58.62.93.183)
方案2:
$ who |cut -b -2 ro ro ro
建立一份测试文件: test.txt
vi test.txt
测试文件内容数据
apple=苹果=pingguo create=建立 delect=删除 exe=程序 good=好的
-c与命令查询结果:
who|cut -c 1-3,20- roo 2021-04-25 21:51 (58.62.93.183) roo 2021-04-25 21:50 (58.62.93.183) roo 2021-04-25 23:05 (58.62.93.183)
看似查询结果相同,只是由于这个例子 who 输出取的数据都是字节字符,因此用 -b 和 -c 没有区别,若是你提取中文,区别就看出来了,看看中文提取的状况:
$ cut -b 3-10 test.txt ple=苹 eate=创 lect=删 e=程序 od=好 $ cut -c 3-10 test.txt ple=苹 eate=创 lect=删 e=程序 od=好
结果发现,这个问题不知道哪一个版本已经修复了,附加上测试使用的 linux 版本,其余命令与 -b使用相似,下面将再也不一一列举。
$ cat /proc/version Linux version 4.15.0-52-generic (buildd@lgw01-amd64-051) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #56-Ubuntu SMP Tue Jun 4 22:49:08 UTC 2019
cut 的 -d 选项的默认间隔符就是制表符,因此当你就是要使用制表符的时候,彻底就能够省略 -d 选项,而直接用-f来取域就能够了。
$ head -n 5 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync $ head -n 5 /etc/passwd |cut -d ':' -f 1 root daemon bin sys sync
$ head -n 5 test.txt |cut -d : -f 1 apple=苹果=pingguo create=建立 delect=删除 exe=程序 good=好的 $ head -n 5 test.txt |cut -d = -f 2 苹果 建立 删除 程序 好的
$ head -n 5 test.txt |cut -d = -f2- $ head -n 5 test.txt |cut -d = -f2,3 $ head -n 5 test.txt |cut -d = -f2-3
$ cat test.txt |cut -d '==' -f2-3 cut: the delimiter must be a single character