目录
24. shell命令--cut
功能说明
cut 命令是 Linux 操作系统中的一个文本处理命令,主要用于从输入行中剪切字节、字符和字段,并将这些剪切的内容显示到标准输出。
cut命令从标准输入或文件中读取数据,然后根据指定的选项和参数,将每一行剪切为字节、字符或字段,并将结果输出到标准输出。
cut 命令 用来显示行中的指定部分,删除文件中指定字段。cut 经常用来显示文件的内容,类似于 type 命令。
说明:该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数 file 所指 明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如cut fl f2 > f3将把文件 fl 和 f2 的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件 f3 中。
当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用 more 等命令分屏显示。为了控制滚屏,可以按 Ctrl+S 键,停止滚屏;按 Ctrl+Q 键可以恢复滚屏。按 Ctrl+C(中断)键可以终止该命令的执行,并且返回 Shell 提示符状态。
语法格式
cut [选项]... [文件]...
SYNOPSIS
cut OPTION... [FILE]...
选项说明
- -b:以字节为单位进行分割。
- -c:以字符为单位进行分割。
- -d 分隔符:使用指定分隔符代替制表符作为划分符,默认使用制表符。
- -f:选择指定的段,如果选择多个段使用“,”分隔。
- --complement:补集模式,提取除指定字段或字符位置外的数据。
- --output-delimiter 字符串:指定输出字段的分隔符。
- -n:与-b一起使用,表示不分割占多个字节的字符。
- --help:显示帮助信息并退出。
- --version:显示版本信息并退出。
参数的具体使用
- b、-c、-f后面可以跟具体的数字或范围,如N、N-、N-M、-M,其中N、M为具体的数字,表示从第几个开始选择或到第几个结束选择。
- -d后面需要指定分隔符,通常与-f一起使用,用于指定字段的分隔符。
实践操作
1. 环境准备
mkdir -p /test/cut
cd /test/cut
head -2 /etc/passwd >file1.txt
cat >file2.txt <<'eof'
No Name Num1 Num2
01 ella 67 86
02 zora 74 84
eof
echo 123456789 >file3.txt
ls
head -v file*
2. 指定分隔符,提取指定文件第N列内容
cut -f 1 file1.txt #不生效
cut -f 2 file2.txt
cut -d : -f 1 file1.txt #需指定分隔符
cut -d" " -f1 file2.txt
cut -d: -f1,3 file1.txt
cut -d" " -f2,4 file2.txt
cut -d3 -f1 file3.txt
3.指定输出字段的分隔符
head -v file*
cut -d: -f1,6 --output-delimiter='-->' file1.txt #这个命令会提取第1个和第6个字段,并使用 "-->" 作为字段的分隔符
cut -d" " -f2,4 --output-delimiter='|' file2.txt #这个命令会提取第2个和第4个字段,并使用 "|" 作为字段的分隔符
4. --complement 选项提取指定字段之外的列(打印除了第N列之外的列)
head -v file*
cut -d: -f7 --complement file1.txt
cut -d" " -f1,3 --complement file2.txt
5. 指定字段的字符或者字节范围
cut 命令可以将一串字符作为列来显示,字符字段的记法:
#N- :从第 N 个字节、字符、字段到结尾;
#N-M :从第 N 个字节、字符、字段到第 M 个(包括 M 在内)字节、字符、字段;
#-M :从第 1 个字节、字符、字段到第 M 个(包括 M 在内)字节、字符、字段。
上面是记法,结合下面选项将摸个范围的字节、字符指定为字段:
#-b 表示字节;
#-c 表示字符;
#-f 表示定义字段。
head -v file*
cut -c 2 file1.txt #打印第2个字符
cut -c5 file2.txt #打印第5个字符
cut -c2-5 file3.txt #打印2-5个字符
cut -c-6 file3.txt #打印前6个字符
cut -c6- file3.txt #打印从6个字符开始到结尾的字符
cut -c-3,6- file3.txt #打印1到3和6到最后的字符
cut -c2-3,6- file3.txt #打印2到3和6到最后的字符
rev file3.txt |cut -c -5 |rev #打印最后5个字符,遗憾的是, cut并没有提供最后字符的支持. 不过我们可以通过字符串反转来实现
命令示例:1. 环境准备
mkdir -p /test/cut
cd /test/cut
head -2 /etc/passwd >file1.txt
cat >file2.txt <<'eof'
No Name Num1 Num2
01 ella 67 86
02 zora 74 84
eof
echo 123456789 >file3.txt
ls
head -v file*
输出结果:
[root@MineGi ~]# mkdir -p /test/cut
[root@MineGi ~]# cd /test/cut
[root@MineGi /test/cut]# head -2 /etc/passwd >file1.txt
[root@MineGi /test/cut]# cat >file2.txt <<'eof'
> No Name Num1 Num2
> 01 ella 67 86
> 02 zora 74 84
> eof
[root@MineGi /test/cut]# echo 123456789 >file3.txt
[root@MineGi /test/cut]# ls
file1.txt file2.txt file3.txt
[root@MineGi /test/cut]# head -v file*
==> file1.txt <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
==> file2.txt <==
No Name Num1 Num2
01 ella 67 86
02 zora 74 84
==> file3.txt <==
123456789
[root@MineGi /test/cut]#

命令示例:2. 指定分隔符,提取指定文件第N列内容
cut -f 1 file1.txt
cut -f 2 file2.txt
cut -d : -f 1 file1.txt
cut -d" " -f1 file2.txt
cut -d: -f1,3 file1.txt
cut -d" " -f2,4 file2.txt
cut -d3 -f1 file3.txt
输出结果:
[root@MineGi /test/cut]# cut -f 1 file1.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@MineGi /test/cut]# cut -f 2 file2.txt
No Name Num1 Num2
01 ella 67 86
02 zora 74 84
[root@MineGi /test/cut]# cut -d : -f 1 file1.txt
root
bin
[root@MineGi /test/cut]# cut -d" " -f1 file2.txt
No
01
02
[root@MineGi /test/cut]# cut -d: -f1,3 file1.txt
root:0
bin:1
[root@MineGi /test/cut]# cut -d" " -f2,4 file2.txt
Name Num2
ella 86
zora 84
[root@MineGi /test/cut]# cut -d3 -f1 file3.txt
12
[root@MineGi /test/cut]#

命令示例:3.指定输出字段的分隔符
head -v file*
cut -d: -f1,6 --output-delimiter='-->' file1.txt
cut -d" " -f2,4 --output-delimiter='|' file2.txt
输出结果:
[root@MineGi /test/cut]# head -v file*
==> file1.txt <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
==> file2.txt <==
No Name Num1 Num2
01 ella 67 86
02 zora 74 84
==> file3.txt <==
123456789
[root@MineGi /test/cut]# cut -d: -f1,6 --output-delimiter='-->' file1.txt
root-->/root
bin-->/bin
[root@MineGi /test/cut]# cut -d" " -f2,4 --output-delimiter='|' file2.txt
Name|Num2
ella|86
zora|84
[root@MineGi /test/cut]#

命令示例:4. --complement 选项提取指定字段之外的列(打印除了第N列之外的列)
head -v file*
cut -d: -f7 --complement file1.txt
cut -d" " -f1,3 --complement file2.txt
输出结果:
[root@MineGi /test/cut]# head -v file*
==> file1.txt <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
==> file2.txt <==
No Name Num1 Num2
01 ella 67 86
02 zora 74 84
==> file3.txt <==
123456789
[root@MineGi /test/cut]# cut -d: -f7 --complement file1.txt
root:x:0:0:root:/root
bin:x:1:1:bin:/bin
[root@MineGi /test/cut]# cut -d" " -f1,3 --complement file2.txt
Name Num2
ella 86
zora 84
[root@MineGi /test/cut]#

命令示例:5. 指定字段的字符或者字节范围
head -v file*
cut -c 2 file1.txt
cut -c5 file2.txt
cut -c2-5 file3.txt
cut -c-6 file3.txt
cut -c6- file3.txt
cut -c-3,6- file3.txt
cut -c2-3,6- file3.txt
rev file3.txt |cut -c -5 |rev
输出结果:
[root@MineGi /test/cut]# head -v file*
==> file1.txt <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
==> file2.txt <==
No Name Num1 Num2
01 ella 67 86
02 zora 74 84
==> file3.txt <==
123456789
[root@MineGi /test/cut]# cut -c 2 file1.txt
o
i
[root@MineGi /test/cut]# cut -c5 file2.txt
a
l
o
[root@MineGi /test/cut]# cut -c2-5 file3.txt
2345
[root@MineGi /test/cut]# cut -c-6 file3.txt
123456
[root@MineGi /test/cut]# cut -c6- file3.txt
6789
[root@MineGi /test/cut]# cut -c-3,6- file3.txt
1236789
[root@MineGi /test/cut]# cut -c2-3,6- file3.txt
236789
[root@MineGi /test/cut]# rev file3.txt |cut -c -5 |rev
56789
[root@MineGi /test/cut]#

注意事项
- 在使用 cut 命令时,请确保你了解你的文本数据的格式和结构,以便正确选择选项和参数。
- 当处理包含多字节字符的文本时,请特别注意 -b 和 -c 选项的行为。
- 如果你需要处理复杂的文本数据或执行复杂的文本处理任务,请考虑使用更强大的文本处理工具(如 awk、sed 或 perl)。
916

被折叠的 条评论
为什么被折叠?



