Linux 剪切命令
考虑以下员工表,该表是在具有固定宽度字体的文本编辑器(例如 Courier)中生成的:
Name | Date of Birth | Time of Birth | Specialty | Date Employed | Time Employed |
---|---|---|---|---|---|
John | 11-05-91 | 10:11:12 | Engineer | 12-06-14 | 13:14:15 |
Paul | 03-16-86 | 16:17:18 | Accountant | 06-19-15 | 19:20:21 |
Peter | 07-20-81 | Carpenter | 08-21-16 | ||
Mary | 22:23:24 | Architect | 01:02:03 | ||
Susan | 04-17-87 | 17:22:36 | Secretary | 21-49-55 | 08:43:32 |
假设此数据位于 Linux 用户目录中名为 employee.txt 的文件中。有六列文本,有六个标题,分别是姓名、出生日期、出生时间等。有六行,由 1 个标题行和 5 个数据行组成。所以,这是一个由列和行(行)组成的表格。每个表格单元格的内容称为字段。字段也是一个子字符串。由于使用了固定宽度的字体,因此存在字符列。每列文本都有字符列。因此,存在字符列和字段列。
要键入表格,请从标题行开始。输入第一个字段并按键盘上的 Tab 键。输入下一个字段并按 Tab 键。以这种方式继续,直到最后一个标头字段之后。按 Enter 键。当按下 Tab 键时,字符“\t”将被插入到文件代码中,用户看不到。然而,它被用户视为一个空格(可能很长)。当在行尾按下 Enter 键时,字符“\n”将被插入到文件代码中,用户看不到。 Tab 键算作一个字符。
每条数据行都以相同的方式键入。但是,如果字段为空,则必须通过按空格键来填充该字段,直到按 Tab 键转到下一个文本列;以便下一个字段的开头与其文本列的开头对齐。
对于 Ubuntu 文本编辑器,Tab 键跨越八个字符。因此,当按下 Tab 键时,它添加的字符数是这样的:如果该字段已满字符,则字符数将是 8 的倍数。不要忘记,在一行的末尾,必须按下 Enter 键,此操作会将一个字符插入到代码中,而用户看不到。当按下 Tab 键时,单个字符将被插入到代码中,而用户看不到。因此,Tab 键算作一个字符。
这些行由换行符分隔。字段由制表符分隔。字段不一定是如上所述的经典字段。分隔符不一定是制表符。在上表中,‘:’可以被认为是分隔符,而不是制表符。在这种情况下,每行中的子串将被重新分区。例如,在“出生时间”选项卡字段中,“:”将分隔两个字符列(在两端)。对于同一个表,第一行和 Peter 的行不会有任何分隔符。这样一条线的整体就成为它的场。
字符列的分隔可以跨越制表符字段。例如,“出生时间”选项卡字段中的最后一个“:”和“工作时间”选项卡字段中的第一个“:”用于分隔字符列、交叉选项卡字段和制表符。其他分隔字符(例如逗号)也可以在其他文件中找到。
文章内容
剪切语法
剪切字段列
删除字节列
剪切字符列
分隔符
-s 选项
–补足选项
结论
剪切语法
cut 命令根据某些选项及其值按字符或按字段复制列。它也可以复制行,但是复制行的条件是有限的。它可以复制出一组列和行;所涉及的行的条件仍然是有限的。行就是行。语法是:
可以有多个文件。不过,本教程仅使用用户目录下的一个名为employee.txt的文件,并包含上述内容。如果没有文件参数,则 cut 从标准输入读取。 cut 是一个 Linux shell 命令,具有不同的可能选项。有些选项需要值。
列计数从 1 开始,而不是从零开始。因此,第一个字符列(左)是第 1 列;第二个字符列是第 2 列;第三个字符列是第 3 列,依此类推。第一个字段列(左)是字段列 1;第二个字段列是字段列 2;第三个字段列是字段列 3,依此类推。
因此,正如已经指出的那样,cut 命令从文件中的行中复制出部分。它通常将结果打印到标准输出。
剪切字段
剪切字段意味着复制字段。原始文件保持不变。 -f 选项用于此目的,其中 f 代表字段。 -f 使用制表符作为分隔符。所以,在
-f 表示命令复制字段而不是字符或字节。 -f 的值为 1 和 3,以逗号分隔且不包含空格。这意味着发送到标准输出,字段列 1 和 3。结果是:
- Paul
16:17:18
- Peter
- Mary
22:23:24
- Susan
17:22:36
如果需要字段列 1、3、5,则 -f 的值将是用逗号分隔的 1,3,5 数字,并且没有空格。这就是选择字段列的方式。在本例中,制表符是分隔符。
字段列范围
以下命令从字段列 2 到字段列 5(含)选择字段列:
输出是:
Date Of Birth | Time of Birth | Specialty | Date Employed |
---|---|---|---|
11-05-91 | 10:11:12 | Engineer | 12-06-14 |
03-16-86 | 16:17:18 | Accountant | 06-19-15 |
07-20-81 | Carpenter | 08-21-16 | |
22:23:24 | Architect | ||
04-17-87 | 17:22:36 | Secretary | 21-49-55 |
请注意 2 和 5 之间的连字符来指示范围。
从字段编号(N 及以上)复制
以下命令从第五个字段列及以上进行复制:
请注意 5 后面的连字符,中间没有空格。结果是:
- 06-19-15
19:20:21
- 08-21-16
01:02:03
- 21-49-55
08:43:32
复制下面的字段编号,N
以下命令复制第二个字段列和以下字段:
请注意 2 之前的连字符,中间没有空格。结果是:
- Paul
86年3月16日
- Peter
81年7月20日
- Mary
- Susan
87年4月17日
删除字节列
字节列的复制方式与字段列类似。如果 ASCII 码有效,则一个字节就是一个字符。在这种情况下,制表符(\t)是一个字符,如果复制出来,它将具有将光标带到第九个字符应该所在的位置的效果。字节的选项是 -b。以下命令针对第二、第三和第四字节(字符)列说明了这一点:
输出是:
ohn
aul
ete
ary
usa
选项卡的效果
以下命令显示从第一个到第十个字节列:
输出是:
- Paul
03-
- Peter
- Mary
07-2
- Susan
04-1
每行的字节(字符)数不相同,因为 (a) Paul 字段中的 Paul 后面有两个空格字符; (b) 制表符被视为一个字符(并且有其作用)。
剪切字符列
字符列的处理方式与字节列的处理方式相同。事实上,在处理多字节字符编码时,使用字符,而不是字节。字符选项是-c。以下两个命令重现前两个输出(按顺序):
$ cut -c 1-10 employee.txt
分隔符
可以使用‘:’、‘-’、‘,’、‘’等分隔符来代替制表符来分隔子字符串。这样的分隔符重新划分形成该行的子字符串。换句话说,字段不再由制表符分隔,而是由新的分隔符分隔。本例中的命令与带有 -f 选项的字段命令类似,但包含用于分隔符的 -d 选项。以下命令根据“-”分隔符复制前两个字段。
输出是:
Name | Date of Birth | Time of Birth | Specialty | Date Employed | Time Employed |
---|---|---|---|---|---|
John | 11-05 | ||||
Paul | 03-16 | ||||
Peter | 07-20 | ||||
Mary | 22:23:24 | Architect | 01:02:03 | ||
Susan | 04-17 |
这个结果在逻辑上是正确的。第一行已全部显示,因为它没有“-”。第五行已全部显示,因为它没有“-”。制表符现在只是一个字符,尽管它仍然有其作用。例如,Paul 的行“Paul 03”现在是一个字段,“16”是第二个字段。使用“-”分隔符,新字段的垂直对齐效果很差。返回了两个字段,用“-”分隔。 ‘-’已重新显示。
没有分隔符的第一行和第五行可以使用 -s 选项删除。请记住,本主题中的行是行。
-s 选项
上面的结果不应该有第一行和第五行。 -s 选项消除没有分隔符的行。使用 -s 选项,上面的命令变为:
得到了一个比较满意的结果,即:
John | 11-05 |
Paul | 03-16 |
Peter | 07-20 |
Susan | 04-17 |
现在可以清楚地看到两个新的重新分区的字段列。
–补足选项
这会复制出所选字节、字符或字段的列的补码。以下命令复制最后两个字段(按制表符分隔符),而不是前四个:
- 06-19-15
19:20:21
- 08-21-16
01:02:03
- 21-49-55
08:43:32
结论
cut 命令从文件的文本行中复制出字节列、字符列或子字符串列。默认情况下,它将行的选定部分发送到标准输出。分隔的子字符串是一个字段。默认情况下,子字符串的分隔符是制表符。然而,这种情况是可以改变的。可以使用“-”、“:”、“ ”等分隔符。完成后,该行将被重新划分为不同的子字符串。 -s 选项可用于从输出中消除没有分隔符的行。