在Linux中cut命令

时间:2020-03-05 15:28:28  来源:igfitidea点击:

Linux和Unix系统中有许多实用程序,可让我们处理和过滤文本文件。
“ cut”是一个命令行实用程序,可让我们从指定的文件或者管道数据中剪切部分行,并将结果打印到标准输出中。
它可用于通过定界符,字节位置和字符来剪切行的一部分。

在本教程中,我们将通过实际示例和最常见选项的详细说明,向我们展示如何使用“ cut”命令。

如何使用“cut”命令

“ cut”命令的语法如下:

cut OPTION... [FILE]...

指示“cut”在剪切出选定部分时是使用定界符,字节位置还是字符的选项,这些行如下所示:

  • '-f'('--fields = LIST')-通过指定一个字段,一组字段或者一系列字段进行选择。这是最常用的选项。
  • '-b'('--bytes = LIST')-通过指定一个字节,一组字节或者字节范围进行选择。
  • '-c'('--characters = LIST')-通过指定一个字符,一组字符或者一系列字符进行选择。

我们可以使用上面列出的选项之一,并且只能使用其中之一。

其他选项是:

  • '-d'('--delimiter')-指定将使用的定界符,而不是默认的“ TAB”定界符。
  • '--complement'-补充选择。使用此选项时,“剪切”显示除所选内容外的所有字节,字符或者字段。
  • '-s'('--only-delimited')-默认情况下,'cut'打印不包含分隔符的行。使用此选项时,“剪切”不会打印不包含定界符的行。
  • '--output-delimiter'-'cut'的默认行为是使用输入定界符作为输出定界符。此选项使我们可以指定其他输出定界符字符串。

“cut”命令可以接受零个或者多个输入文件名。
如果未指定“ 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

例如,要显示第一个和第三个字段,请使用:

cut test.txt -f 1,3
245:789	M:4540
535:763	M:3476

或者,如果要显示从第一到第四字段:

cut test.txt -f -4
245:789	4567	M:4540	Admin
535:763	4987	M:3476	Sales

如何基于定界符进行剪切

要基于定界符进行剪切,请在调用“ -d”选项后调用我们要使用的定界符。

例如,要使用“:”作为分隔符来显示第一和第三字段,请输入:

cut test.txt -d ':' -f 1,3
245:4540	Admin	01
535:3476	Sales	11

我们可以使用任何单个字符作为分隔符。
在下面的示例中,我们使用空格字符作为分隔符并打印第二个字段:

echo "Lorem ipsum dolor sit amet" | cut -d ' ' -f 2
ipsum

如何补充选择

要补充选择字段列表,请使用'--complement'选项。
这将仅打印那些未使用“ -f”选项选择的字段。

以下命令将打印除第一个和第三个以外的所有字段:

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”命令通过管道与其他命令结合使用。
这里有一些例子:

获取所有用户的列表

“ getent passwd”命令的输出传递到“ cut”,该命令使用“:”作为分隔符打印第一个字段。

getent passwd | cut -d ':' -f1

输出显示所有系统用户的列表。

查看10个最常用的命令

在以下示例中,“ cut”用于从“ history”命令输出的每一行中剥离前8个字节。

history | cut -c8- | sort | uniq -c | sort -rn | head