Linux 字符截取命令 -cut
作者 | WenasWei
一 Linux 之 cut 命令详解
将每个文件中选定的行局部打印到规范输入, 如果没有文件,或者文件是 -,则读取规范输出, 长选项的强制参数对于短选项也是强制的。
cut 是一个选取命令, 一般来说,选取信息通常是针对“行”来进行剖析的,并不是整篇信息剖析的, 用于显示每行从结尾算起 num1 到 num2 的文字。
1.1 应用语法
- cut [-bn] [file]
- cut [-c] [file]
- cut [-df] [file]
1.2 应用阐明
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至规范输入。
如果不指定 File 参数,cut 命令将读取规范输出。必须指定 -b、-c 或 -f 标记之一, cut 默认以制表符为分隔符。
参数:
- -b:以字节为单位进行宰割。这些字节地位将疏忽多字节字符边界,除非也指定了 -n 标记。
- -c:以字符为单位进行宰割。
- -d:自定义分隔符,默认为制表符。
- -f:与 - d 一起应用,指定显示哪个区域。
- -n:勾销宰割多字节字符。仅和 -b 标记一起应用。如果字符的最初一个字节落在由 -b 标记的 List 参数批示的范畴之内,该字符将被写出;否则,该字符将被排除
在 -b、-c 或 -f 中只能应用一个。每个 LIST 由一个组成
范畴,或用逗号分隔的多个范畴。选定的输出被写入
程序与读取和写入的程序雷同。
1.3 三个办法定位
cut 命令次要是承受三个定位办法:
- 第一,字节(bytes),用选项 -b
- 第二,字符(characters),用选项 -c
- 第三,域(fields),用选项 -f
二 cut 帮忙文档
执行命令查问帮忙文档:
cut --help
cut 帮忙文档解析:
(1)’- b 字节列表 ’
‘–bytes = 字节列表 ’
抉择仅打印字节列表中列出的地位中的 字节。制表符和退格键与其余任何字符一样;他们占用了 1 个字节。如果指定了输入定界符,而后在所选字节范畴之间输入该字符串。
(2)’- c 字符列表 ’
‘–characters = 字符列表 ’
抉择仅打印在 character-list 中列出的地位中的 字符。目前与 -b 雷同,然而国际化将扭转这种情况。制表符和退格键与其余任何字符一样;他们占 1 个字符。如果指定了输入定界符,而后在所选字节范畴之间输入该字符串。
(3)’-d input_delim_byte’
‘–delimiter = input_delim_byte’
和 -F,请应用 input_delim_byte 的第一个字节作为输出字段分隔符(默认为 TAB)。
(4)’- f 字段列表 ’
‘–fields = 字段列表 ’
抉择仅打印在 field-list 中列出的字段。默认状况下,字段之间用 TAB 字符分隔。还要打印任何不蕴含定界符的行,除非 - 仅定界(-s)选项已指定。
(5)’-n’
不要拆分多字节字符。
(6)’-s’
‘- 仅定界 ’
为了 -F,请勿打印不蕴含字段分隔符的行。通常,任何没有字段分隔符的行都按原样打印。
三 命令详解与应用案例
3.1 实例一: 查问命令联合 cut -b
当你执行 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)
(1) 提取每一行的第 3 个字节
$ who|cut -b 3
o
o
(2) 提取第 1,第 2、第 3 个字节
计划 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 前面所有的定位进行从小到大排序,而后再提取。不能颠倒定位的程序。
(3) 提取第 1 到第 3,第 5 和第 20 个字符之后的所有数据
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)
(4) 提取第 n 个字节前后所有的字节
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
3.2 实例二: 文本文件联合 cut -c
(1)创立测试文件
-
创立一份测试文件: test.txt
vi test.txt
-
测试文件内容数据
apple= 苹果 =pingguo create= 创立 delect= 删除 exe= 程序 good= 好的
(2) -c 和 -b 的应用区别
- 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
3.3 实例三: cut -d 与 -f 的独特应用
cut 的 -d 选项的默认距离符就是制表符,所以当你就是要应用制表符的时候,齐全就能够省略 -d 选项,而间接用-f 来取域就能够了。
(1) 联合查问命令取出指定符号的切割的第一域
$ 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
(2) 取出文档中指定符号的切割的第一域
$ head -n 5 test.txt |cut -d : -f 1
apple= 苹果 =pingguo
create= 创立
delect= 删除
exe= 程序
good= 好的
$ head -n 5 test.txt |cut -d = -f 2
苹果
创立
删除
程序
好的
(3)如上 -b 中的拼接规定同理应用
$ 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
(4)分隔符必须为单个字符,多个异样如下
$ cat test.txt |cut -d '==' -f2-3
cut: the delimiter must be a single character
四 应用场景和缺点有余
4.1 cut 的应用场景
- cut 命令用来显示行中的指定局部,删除文件中指定字段
- 脚本切割读取文件或者指定命令信息
- 统计指定的服务器信息处理,进行演绎统计
4.2 cut 的缺点和有余
- 不能解决多空格
- 如果文件外面的某些域是由若干个空格来距离的,那么用 cut 就有点麻烦了,因为 cut 只善于解决“以一个字符距离”的文本内容
4.3 cut 和 awk 的差异
- 当一个文件中每一行都含有一个或多个空格时,这时候只能用 awk 来分隔
- cut 默认的分隔符是制表符,awk 默认的分隔符是一个空格或者多个空格或者是制表符
- 语法格局不同
参考文档:
- [1] 西方雨中漫步者. 博客园: https://www.cnblogs.com/dong0… ,2011-12-09.
- [2] GNU 操作系统: http://www.gnu.org/software/c…