在Linux中的Cut命令
在Linux和Unix系统中,有许多实用工具可以让你处理和过滤文本文件。cut
是一个命令行工具,允许你从指定的文件或管道数据中剪切部分行,并将结果打印到标准输出。它可以用来按分隔符、字节位置和字符来切割一行的部分内容。
在这篇文章中,我们将通过实际例子和对最常见的选项的详细解释,向你展示如何使用cut
命令。
如何使用 cut
命令
cut
命令的句法如下:
cut OPTION... [FILE]...
告诉cut
在切出选定的行的部分时是否使用分隔符、字节位置或字符的选项如下:
-f
(--fields=LIST
) - 通过指定一个字段、一组字段或一个字段范围来选择。这是最常用的选项。-b
(--bytes=LIST
) - 通过指定一个字节、一组字节或一个字节的范围来选择。-c
(--characters=LIST
) - 通过指定一个字符、一组字符或一个字符范围来选择。
你可以使用一个,而且只能使用上面列出的一个选项。
其他的选择是:
-d
(--delimiter
) - 指定一个分界符,用来代替默认的"TAB"分界符。--complement
- 补充选择。当使用这个选项时,cut
显示所有的字节、字符或字段,除了选定的。-s
(--only-delimited
) - 默认情况下,cut
会打印不包含定界符的行。当使用这个选项时,cut
不会打印不包含定界符的行。--output-delimiter
-cut
的默认行为是使用输入定界符作为输出定界符。这个选项允许你指定一个不同的输出定界符字符串。
cut
命令可以接受零个或多个输入FILE名。如果没有指定FILE
,或者当FILE
是-
时,cut
将从标准输入读取。
传递给-f
、-b
和-c
选项的LIST
参数可以是一个整数、由逗号分隔的多个整数、一个整数范围或由逗号分隔的多个整数范围。每个范围可以是以下之一:
N
第N个字段、字节或字符,从1开始。- 从第N个字段、字节或字符开始,
N-
到行的末尾。 - 从第N个字段、字节或字符到第M个字段、字节或字符,
N-M
。 - 从第一个字段、字节或字符到第M个字段、字节或字符,
-M
。
如何按字段切割
要指定应该被剪切的字段,请使用-f
选项调用该命令。如果没有指定,默认的分隔符是"TAB"。
在下面的例子中,我们将使用以下文件。各个字段用制表符隔开。
245:789 4567 M:4540 Admin 01:10:1980
535:763 4987 M:3476 Sales 11:04:1978
例如,要显示第1和第3个字段,你将使用:
cut test.txt -f 1,3
输出
245:789 M:4540
535:763 M:3476
或者,如果你想从第1个字段显示到第4个字段的话:
cut test.txt -f -4
输出
245:789 4567 M:4540 Admin
535:763 4987 M:3476 Sales
如何根据分隔符切割
要根据分隔符进行切割,请在调用命令时使用-d
选项,并在后面加上你想使用的分隔符。
例如,要用": "作为分隔符来显示第1和第3个字段,你可以键入:
cut test.txt -d ':' -f 1,3
输出
245:4540 Admin 01
535:3476 Sales 11
你可以使用任何单一字符作为分隔符。在下面的例子中,我们使用空格字符作为分隔符,打印第2个字段:
echo "Lorem ipsum dolor sit amet" | cut -d ' ' -f 2
输出
ipsum
如何补选
为了补充选择字段列表,使用--complement
选项。这将只打印那些没有用-f
选项选择的字段。
下面的命令将打印除第1和第3个字段以外的所有字段:
cut test.txt -f 1,3 --complement
输出
4567 Admin 01:10:1980
4987 Sales 11:04:1978
如何指定输出分隔符
要指定输出定界符,请使用--output-delimiter
选项。例如,要将输出定界符设置为_
,你可以使用:
cut test.txt -f 1,3 --output-delimiter='_'
输出
245:789_M:4540
535:763_M:3476
如何按字节和字符切割
在进一步讨论之前,让我们先对字节和字符进行区分。
一个字节是8位,可以代表256个不同的值。当ASCII标准建立时,它考虑到了所有的字母、数字和符号,这些都是英语工作所必需的。ASCII字符表有128个字符,每个字符由一个字节表示。当计算机开始在全球范围内普及时,科技公司开始为不同语言引入新的字符编码。对于拥有超过256个字符的语言,简单的1对1映射是不可能的。这导致了不同的问题,如共享文件或浏览网站,因此需要一个新的Unicode标准,可以处理世界上大多数的书写系统。UTF-8的诞生就是为了解决这些问题。在UTF-8中,并非所有的字符都用1个字节表示。字符可以用1字节到4字节来表示。
-b
(--bytes
)选项告诉命令从给定的字节位置所指定的每一行中剪下一些部分。
在下面的例子中,我们使用的是ü
字符,需要2个字节。
选择第5个字节:
echo 'drüberspringen' | cut -b 5
输出
b
选择第5、第9和第13个字节:
echo 'drüberspringen' | cut -b 5,9,13
输出
bpg
选择第1至第5个字节的范围:
echo 'drüberspringen' | cut -b 1-5
输出
drüb
在写这篇文章的时候,GNU coreutils中捆绑的cut
版本并没有按字符切割的选项。当使用-c
选项时,cut
的行为与使用-b
选项时相同。
Cut实例
cut
命令通常通过管道与其他命令结合使用。这里有几个例子:
获取所有用户的列表
getent passwd
命令的输出被传递给cut
,它使用:
作为分隔符来打印第1个字段。
getent passwd | cut -d ':' -f1
输出显示的是所有系统用户的列表 。
查看10个最经常使用的命令
在下面的例子中,cut
被用来从history
命令输出的每一行中剥离前8个字节。
history | cut -c8- | sort | uniq -c | sort -rn | head
总结
cut
命令用于显示给定文件或标准输入的每一行中的选定字段。
虽然非常有用,但cut
有一些限制。它不支持指定一个以上的字符作为分隔符,也不支持多个分隔符。
如果你有任何问题或反馈意见,请随时留言。