在Linux中的Cut命令

评论 0 浏览 0 2019-04-07

在Linux和Unix系统中,有许多实用工具可以让你处理和过滤文本文件。cut是一个命令行工具,允许你从指定的文件或管道数据中剪切部分行,并将结果打印到标准输出。它可以用来按分隔符、字节位置和字符来切割一行的部分内容。

Free Online CSV Text File Splitter:...
Free Online CSV Text File Splitter: How To Use It?

在这篇文章中,我们将通过实际例子和对最常见的选项的详细解释,向你展示如何使用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"。

在下面的例子中,我们将使用以下文件。各个字段用制表符隔开。

test.txt
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有一些限制。它不支持指定一个以上的字符作为分隔符,也不支持多个分隔符。

如果你有任何问题或反馈意见,请随时留言。

最后更新2023-04-18
0 个评论
标签