「cut(1)」- 输出每个行中选中的部分

常用命令

截断命令输出(当输出行较长时,截断行,使其输出不会换行显示,以便于查看):

grep 'str' file-with-long-lines.txt | cut -c 1-80

如果想要使用 TAB 作为分隔字符,在终端中可能无法输入 TAB,因为 TAB 是终端里默认的命令提示。这里要用到小技巧按下 CTRL + v 然后按下 TAB 键,就可以正常输入 TAB(其他很多的特殊字符也可以使用这种方法输入)。

语法格式

cut OPTION... [FILE]...

命令描述

输出每个行中指定的列,可以说是一个简易版的 awk。

比如 cut -f 2-4 FILE 输入文件 FILE 的第 2 列到第 4 列的内容。

如果没有指定 FILE,或者 FILE 为 -,则从标准输入中读取内容。更多选项及含义参照下文中的介绍。

命令选项

用于长选项的必须参数也必须提供给对应的短选项。

-b, –bytes=BYTE-LIST
仅打印BYTE-LIST所指范围内的字节。比如,–bytes=’2-10′,打印第2个字节到第10个字节之间所有的字符。

TAB和BACKSPACE与其他字符一样,占用1个字节,不会视为分隔符。如果指定了输出分隔符(–output-delimiter=STRING),然后在选定字节的范围之间输出该字符串。

关于BYTE-LIST的取值,参照下面的介绍。

-c, –characters=CHAR-LIST
仅打印CHAR-LIST范围内的字符。比如,–characters=’2-10′,打印第2个字符到第10个字符之间所有的字符。

现在与-b选项作用一样,但国际化标准可能会不一样。TAB和BACKSPACE与其他字符一样,占用1个字节。如果指定了输出分隔符(–output-delimiter=STRING),然后在选定的字节范围之间输出STRING。

关于CHAR-LIST的取值,参照下面的介绍。

-f, –fields=FIELD-LIST
选择仅打印FIELD-LIST中列出的字段。字段默认由TAB字符分隔。但是还会输出不包含分隔符的任何行,除非指定了–only-delimited(-s)选项。

注意awk支持更复杂的字段处理,例如重新排序字段以、处理与空白字符对齐的字段。默认情况下,awk使用(和放弃)空白字符来分隔字段,并忽略前导和尾随空白。

# awk ‘{print $2}’ # print the second field

# awk ‘{print $(NF-1)}’ # print the penultimate field

# awk ‘{print $2,$1}’ # reorder the first two fields

请注意,虽然cut以任意顺序接受字段规范,但输出始终按文件中遇到的顺序排列。

万一awk不可用,可以使用join命令来处理空白字符,如awk所做的那样:

# join -a1 -o 1.2 – /dev/null # print the second field

# join -a1 -o 1.2,1.1 – /dev/null # reorder the first two fields

关于FIELD-LIST的取值,参照下面的介绍。

-d, –delimiter=DELIM
使用DELIM的第一个字节作为字段分隔符来切割行,代替默认的TAB。通常与-f选项一起使用,如果-d选项与-b或-c一起使用时会提示cut: an input delimiter may be specified only when operating on fields。

–complement
这个选项是一个GNU扩展。选择打印用-b,-c或-f选项选择的补充字节,字符或字段。换句话说,不要打印通过这些选项指定的字节,字符或字段。当你有很多字段并且想要打印除几个字段以外的所有字段时,此选项非常有用。

-s, –only-delimited
用于-f选项,不打印那些不包含分隔符的行。通常情况下,任何没有字段分隔符的行也会被打印。

通常与-f选项一起使用,如果-d选项与-b或-c一起使用时会提示cut: suppressing non-delimited lines makes sense only when operating on fields。

–output-delimiter=STRING
使用-f,输出字段由STRING分隔。使用-f的默认值是使用输入是使用的分隔符。使用-b或-c选择字节或字符偏移量的范围(与字段的范围相反)时,会在所选字节的非重叠范围之间输出STRING。

-z, –zero-terminated
使用零字节而不是换行符(ASCII LF)分隔项目 即,将输入视为由ASCII NUL分隔的项目,并用ASCII NUL终止输出项目。

这个选项可以和’perl -0’或者’find -print0’和’xargs -0’结合使用,它们可以可靠地处理任意文件名(甚至包含空格或其他特殊字符)。

–help
显示帮助信息并退出。

–version
显示版本信息并退出。

-n
已忽略该选项。

关于-b、-c、-f选项

选项-b, -c, -f只能出现一个,不能同时使用。因为它们都是行范围选择的选项,所以不能一起使用。

BYTE-LIST, CHARACTER-LIST, FIELD-LIST是用逗号分隔的一个或多个数字或范围(用短划线分隔的两个数字)。BYTE-LIST, CHARACTER-LIST, FIELD-LIST中的值从1开始编号,可以使用不完整的范围:‘-m’表示’1-m’;‘n-’表示从n开始到结束。列表元素可以重复,可以重叠,并可以按任意顺序指定;但所选输入的写入顺序与读取的顺序相同,并且只输出一次。

关于BYTE-LIST, CHARACTER-LIST, FIELD-LIST的取值
LIST可以是一个值、或者一个范围。所选择的输入按照读取时相同的顺序写入(即不受LIST的顺序影响),并写入一次(即重复的字段是无效的)。范围可以是以下之一:

  • N:第N个字节、字符或字段。从1开始。
  • N-:从第N个字节、字符或字段到结束。
  • N-M:从第N个字节到第M个字节、字符或字段。包含M。
  • -M:从开始到第M个字节到第M个字节、字符或字段。包含M。

比如,-f ‘5,1-3,7-‘,它的含义是打印第5列,第1到3列,第7列到最后一列。正如上面提到的“列表元素可以重复,可以重叠,并可以按任意顺序指定;但所选输入的写入顺序与读取的顺序相同,并且只输出一次”。因此,实际上的输出顺序是-f “1-3,5,7-“,而不是按照指定的顺序进行输出。

附加说明

相关手册

完整在线文档:http://www.gnu.org/software/coreutils/cut

查看info手册:info ‘(coreutils) cut invocation’

参考文献