myfreax
cut

Linux cut命令详解与教程

Linux和Unix系统中有许多实用的命令可用于处理和过滤文本文件

6 min read
By myfreax
Linux cut命令详解与教程
Linux cut命令详解与教程

Linux和Unix系统中有许多实用的命令可用于处理和过滤文本文件。cut是一个命令行程序,允许您从指定文件或标准输入中剪切部分的行,并将结果写入到标准输出

cut命令可以接受零个或多个文件的输入。如果未指定文件,或者文件为-cut命令将读取标准输入

cut可通过分隔符,字节位置和字符来切割行的部分。在本教程中,我们将通过实际示例和最常见cut命令选项向您详解如何在Linux使用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默认情况下使用输入分隔符作为输出分隔符。此选项允许您指定不同的输出分隔符。

传递给-f-b-c选项的参数可以是一个整数或者一个范围的整数,或者由逗号分隔的多个整数范围。每个范围可以是以下之一。

N第N个字段,字节或字符,从1开始。N-从第N个字段,字节或字符到行尾。

N-M从第N个到第M个字段,字节或字符。-M从第一个字段到第M个字段,字节或字符。

cut 按字段切割

cat > test.txt  << EOF
245:789$(printf '\t')4567$(printf '\t')M:4540$(printf '\t')Admin$(printf '\t')01:10:1980
535:763$(printf '\t')4987$(printf '\t')M:3476$(printf '\t')Sales$(printf '\t')11:04:1978
EOF
test.txt

在下面的示例中,我们将使用test.txt文件作为例子。字段都由制表符分隔。可直接运行使用HereDoccat命令整合的脚本创建文件test.txt

首先尝试使用默认分隔符TAB制作表符选取字段的方式,接下来再尝试一下使用其它分隔符切割字段。

例如cut test.txt -f 1,3命令将会打印第一个和第三个字段。cut test.txt -f -4命令打印第1到第4个字段。

cut test.txt -f 1,3
cut test.txt -f -4

cut 指定分隔符

cut命令的-d选项允许你指定分隔符进行剪切。例如命令cut test.txt -d ':' -f 1,3使用:作为分隔符切割第1和第3个字段。

您可以使用任何单个字符作为分隔符。例如命令echo "Lorem ipsum dolor sit amet" | cut -d ' ' -f 2使用空格字符作为分隔符并打印第二个字段。

cut test.txt -d ':' -f 1,3
echo "Lorem ipsum dolor sit amet" | cut -d ' ' -f 2

cut 补充选择

你还可以使用--complement选项仅打印未使用-f选项指定的字段。例如命令cut test.txt -f 1,3 --complement将打印除第1和第3之外的所有字段。

cut test.txt -f 1,3 --complement

cut 指定输出分隔符

默认情况cut命令的输出格式使用tab制表符进行分隔。要指定输出分隔符,请使用--output-delimiter选项。

例如命令cut test.txt -f 1,3 --output-delimiter='_'指定输出分隔符为_

cut test.txt -f 1,3 --output-delimiter='_'

cut 按字节和字符切割

在继续之前,让我们区分字节和字符。一个字节是8位,可以表示256个不同的值。当ASCII标准建立时,它考虑了使用英语所需的所有字母,数字和符号。

ASCII字符表有128个字符,每个字符由一个字节表示。当计算机开始在全球流行时。

科技公司开始为不同语言和超过256个字符的语言引入新的字符编码,不可能进行简单的1对1映射。

这导致诸如共享文档或浏览乱码的问题,并且需要能够处理世界所有书写系统的新Unicode标准。

创建UTF-8是为了解决这些问题。在UTF-8中,并非所有字符都用1个字节表示。字符也可以用1字节到4字节表示。

例如命令echo 'drüberspringen' | cut -b 5切割第五个字节,dr字符占用一个字节,这里的ü字符占用2字节,所以命令会打印b字符。

echo 'drüberspringen' | cut -b 5,9,13命令切割第5,第9和第13个字节。echo 'drüberspringen' | cut -b 1-5命令选择从1到5字节的范围。

在撰写本文时,GNU coreutils中打包的cut版本没有按字符剪切的选项。使用-c选项时,cut命令行为与使用-b选项时相同。

echo 'drüberspringen' | cut -b 5 # b
echo 'drüberspringen' | cut -b 5,9,13 # bpg
echo 'drüberspringen' | cut -b 1-5 # drüb

获取所有用户名称

cut命令通常与管道组合他命令使用。这里有一些例子。例如命令getent passwd | cut -d ':' -f 1列出所有用户的名称。

命令将getent passwd标准输出通过管道传递给cut命令输入,然后指定分隔符:,打印第一个字段。

getent passwd | cut -d ':' -f 1

查看最常用的命令

history | cut -c8- | sort | uniq -c | sort -rn | head命令查看10个最常用的命令,cut用于从history命令输出的每一行中去除前8个字节。

结论

到目前为止,您应该很好地理解如何使用Linux cut命令。虽然非常有用,但cut命令有一些限制。它不支持将多个字符指定为分隔符。