Linux命令允许您从文件或数据流中提取部分文本。它对于处理分隔数据(例如CSV 文件)特别有用。这是你需要知道的。
cut
剪切命令
该命令是Unix世界的老手,于 1982 年作为 AT&T System III UNIX 的一部分首次亮相。它在生活中的目的是根据您设置的标准从文件或流中截取部分文本。它的语法和它的用途一样简单,但正是这种联合的简单性使它如此有用。
cut
有关的Linux和BSD有什么区别?
以历史悠久的 UNIX 方式,通过与其他实用程序相结合,您可以为具有挑战性的问题创建优雅而强大的解决方案。虽然有不同的版本,但我们将讨论标准的 GNU/Linux 版本。请注意,其他版本,特别是BSD变体中的版本,不包括此处描述的所有选项。
cut
grep
cut
cut
您可以通过发出以下命令来检查计算机上安装了哪个版本:
剪切--版本
如果您在输出中看到“GNU coreutils”,那么您使用的是我们将在本文中描述的版本。所有版本都具有此功能,但 Linux 版本已添加了增强功能。
cut
切割的第一步
无论我们是将信息输入还是用于读取文件,我们使用的命令都是相同的。您可以对输入流执行的任何操作都可以在文件中的一行文本上执行, 反之亦然。我们可以告诉我们使用字节、字符或分隔字段。
cut
cut
cut
cut
要选择单个字节,我们使用(byte) 选项并告诉我们想要哪个或哪些字节。在这种情况下,它是字节 5。我们将字符串“how-to geek”发送到带有管道“|”的命令中,来自.
-b
cut
cut
echo
echo 'how-to 极客' | 切-b 5
该字符串中的第五个字节是“t”,因此通过在终端窗口中打印“t”来响应。
cut
要指定 范围 ,我们使用连字符。要提取字节 5 到 - 包括 - 11,我们将发出以下命令:
echo 'how-to 极客' | 切-b 5-11
您可以通过用逗号分隔它们来提供多个单个字节或范围。要提取字节 5 和字节 11,请使用以下命令:
echo 'how-to 极客' | 切-b 5,11
要获取每个单词的第一个字母,我们可以使用以下命令:
echo 'how-to 极客' | 切-b 1,5,8
如果您使用没有 第一个 数字的连字符,则返回从位置 1 到数字的所有内容。如果您使用没有 第二个 数字的连字符,则返回从第一个数字到流或行末尾的所有内容。
cut
cut
echo 'how-to 极客' | 切-b -6
echo 'how-to 极客' | 切-b 8-
对字符使用 cut
使用字符与使用字节几乎相同。在这两种情况下,必须特别注意复杂的字符。通过使用(character) 选项,我们告诉以字符而不是字节工作。
cut
-c
cut
echo 'how-to 极客' | 切-c 1,5,8
echo 'how-to 极客' | 切-c 8-11
这些工作完全符合您的预期。但是看看这个例子。这是一个六个字母的单词,因此要求返回从 1 到 6 的字符应该返回整个单词。但事实并非如此。少了一个字。要查看整个单词,我们必须询问从 1 到 7 的字符。
cut
回声“皮纳塔” | 剪切-c 1-6
回声“皮纳塔” | 剪切-c 1-7
问题是字符“ñ”实际上是由两个字节组成的。我们可以很容易地看到这一点。我们有一个包含这行文本的短文本文件:
猫 unicode.txt
我们将使用该实用程序检查该文件。使用(canonical) 选项为我们提供了一个十六进制数字表,右边是对应的 ASCII 。在 ASCII 表中,没有显示“ñ”,而是有代表两个不可打印字符的点。这些是十六进制表中突出显示的字节。
hexdump
-C
hexdump -C unicode.txt
显示程序(在本例中为 Bash shell )使用这两个字节来识别“ñ”。许多Unicode 字符使用三个或更多字节来表示单个字符。
如果我们要求输入字符 3 或字符 4,则会显示非打印字符的符号。如果我们要求字节 3和4,shell 会将它们解释为“ñ”。
回声“皮纳塔” | 剪切-c 3
回声“皮纳塔” | 剪切-c 4
回声“皮纳塔” | 剪切-c 3-4
使用带有分隔数据的 cut
我们可以要求使用指定的分隔符分割文本行。默认情况下,cut 使用制表符,但很容易告诉它使用我们想要的任何内容。“/etc/passwd”文件中的字段由冒号“:”分隔,因此我们将使用它作为分隔符并提取一些文本。
cut
分隔符之间的文本部分称为 fields,并且像字节或字符一样被引用,但它们前面有(fields) 选项。您可以在“f”和数字之间留一个空格,也可以不留。
-f
第一个命令使用(delimiter) 选项告诉 cut 使用“:”作为分隔符。它将从“/etc/passwd”文件的每一行中提取第一个字段。这将是一个很长的列表,因此我们使用( number) 选项仅显示前五个响应。第二个命令做同样的事情,但用于向我们显示最后五个响应。
head
-n
tail
剪切 -d':' -f1 /etc/passwd | 头 -n 5
剪切 -d':' -f2 /etc/passwd | 尾 -n 5
要提取选定的字段,请将它们列为逗号分隔的列表。此命令将提取字段一到三、五和六。
剪切 -d':' -f1-3,5,6 /etc/passwd | 尾 -n 5
通过包含在命令中,我们可以查找包含“/bin/bash”的行。这意味着我们只能列出那些将 Bash 作为其默认 shell 的条目。这通常是“普通”用户帐户。我们将要求从 1 到 6 的字段,因为第七个字段是默认的 shell 字段,我们已经知道它是什么——我们正在搜索它。
grep
grep "/bin/bash" /etc/passwd | 剪切 -d':' -f1-6
包含除一个之外的所有字段的另一种方法是使用该选项。这会反转字段选择并显示尚未请求的所有 内容 。让我们重复最后一个命令,但只要求输入字段 7。然后我们将使用该选项再次运行该命令。
--complement
--complement
grep "/bin/bash" /etc/passwd | 剪切 -d':' -f7
grep "/bin/bash" /etc/passwd | 剪切 -d':' -f7 --complement
第一个命令找到一个条目列表,但字段 7 没有给我们任何东西来区分它们,所以我们不知道这些条目指的是谁。在第二个命令中,通过添加选项,我们得到除了字段 7 之外的所有内容。
--complement
管道切割成切割
继续使用“/etc/passwd”文件,让我们提取字段 5。这是拥有用户帐户的用户的实际名称。
grep "/bin/bash" /etc/passwd | 剪切 -d':' -f5
第五个字段具有以逗号分隔的子字段。它们很少填充,因此它们显示为一行逗号。
我们可以通过将前一个命令的输出传递到另一个调用来删除逗号。第二个实例 使用逗号“,”作为其分隔符。( only delimited) 选项告诉抑制根本没有分隔符的结果。
cut
cut
-s
cut
grep "/bin/bash" /etc/passwd | 剪切-d':' -s -f5 | 剪切 -d',' -s -f1
因为根条目在第五个字段中没有逗号子字段,所以它被抑制了,我们得到了我们想要的结果——在这台计算机上配置的“真实”用户的名称列表。
输出分隔符
我们有一个小文件,其中包含一些逗号分隔值。此虚拟数据中的字段是:
- ID: 数据库 ID 号
- First:主题的名字。
- Last:主题的姓氏。
- 电子邮件:他们的电子邮件地址。
- IP 地址:他们的IP 地址。
- 品牌:他们驾驶的汽车品牌。
- 型号:他们驾驶的机动车辆的型号。
- 年份:他们的汽车制造年份。
小猫.csv
如果我们告诉 cut 使用逗号作为分隔符,我们可以像以前一样提取字段。有时您需要从文件中提取数据,但您不希望在结果中包含字段分隔符。使用 ,我们可以告诉 cut 使用什么字符——或者实际上是字符 序列——来代替实际的分隔符。
--output-delimiter
剪切 -d ',' -f 2,3 small.csv
cut -d ',' -f 2,3 small.csv --output-delimiter=' '
第二个命令告诉用空格替换逗号。
cut
我们可以更进一步,并使用此功能将输出转换为垂直列表。此命令使用换行符作为输出分隔符。请注意,我们需要包含“$”以使换行符起作用,而不是解释为两个字符的文字序列。
我们将使用过滤掉 Morgana Renwick 的条目,并要求打印从字段 2 到记录末尾的所有字段,并使用换行符作为输出分隔符。
grep
cut
grep 'renwick' small.csv | 剪切 -d ',' -f2- --output-delimiter=$''
老歌但戈尔迪
在撰写本文时,little cut命令即将迎来它的 40 岁生日,而我们今天仍在使用它并写下它。我想今天的删减文本和 40 年前一样。也就是说,当您手头有正确的工具时,会容易得多。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.