使用 Linux Bash 提取子字符串

linuxopen sourceoperating system更新于 2026/1/27 4:22:17

概述

从字符串中提取子字符串是 Linux 中文本处理的基本且常见的操作。

我们在这里介绍使用 Linux 命令行从字符串中提取子字符串的不同方法。

提取基于索引的子字符串

首先,我们来快速了解一下如何使用四种不同的方法提取基于索引的子字符串。

  • 使用 cut 命令

  • 使用 awk 命令

  • 使用 Bash 的子字符串扩展

  • 使用 expr 命令

接下来,我们将看到它们的实际作用。

使用 cut 命令

我们可以使用"cut"命令从输入字符串中提取从位置 N 到位置 M 的字符。

要使用 cut 命令解决问题,我们必须在起始索引上加 1,在结束索引上减 1。因此,新的区间分别为 4-8 和 9-13。

现在,我们将看看 cut 命令是否能解决问题。

$ cut -c 5-9 <<< '0123Linux9'
Linux

我们找到了预期的子字符串"Linux"——问题不再出现。

我们通过一个 here-string 将输入字符串传递给 cut 函数,然后输出结果。

使用 awk 命令

如果我们想解决 Linux 中的一些文本处理问题,我们不需要记住任何特定的工具。我们只需要使用 awk。

substr() 函数接受三个参数。让我们详细研究一下它们。

  • s − 输入字符串

  • i − 子字符串的起始索引(awk 使用从 1 开始的索引系统)

  • n − 子字符串的长度。如果省略,awk 将返回从索引 i 到输入字符串最后一个字符的内容作为子字符串。

现在让我们看看 awk 的 substring() 函数是否能提供所需的输出。

$ awk '{print substr($0, 5, 5)}' <<< '0123Linux9'
Linux

我们从位置 0(第一个字符)开始,一直数到位置 4(最后一个字符)。然后我们加一,因为我们是从 1 而不是 0 开始计数的。

使用 Bash 的子字符串扩展

我们已经了解了 cut 和 awks 如何轻松提取类似子字符串的字符串。

不要使用不支持子字符串扩展的 sed,而要使用支持子字符串扩展的 bash。

如今,bash 是大多数现代 Linux 发行版的默认命令行解释器。换句话说,如果我们想使用命令行,我们不需要安装任何其他程序。

$ STR="0123Linux9"
$ echo ${STR:4:5}
Linux

使用 expr 命令

expr(表达式)是 GNU 核心实用程序包中的一个核心实用程序。这意味着它适用于所有 Linux 系统。

此外,expr 有一个名为 substr 的子命令,它允许我们从表达式中提取子字符串。

expr substr <input_string> <start_index> <length>

您可能需要提及,expr 函数使用基于 1 的索引系统。

假设我们要从每行文本中提取前两个单词。我们可以使用 substring 函数来处理

$ expr substr "0123Linux9"5 5
Linux

上面的输出表明 expr 解决方案有效。

提取基于模式的子字符串

现在,除了我们已经学过的索引子字符串之外,我们还将探索模式子字符串。

我们将讨论两种解决问题的方法:一种方法,我们将

  • 使用 cut 命令

  • 使用 awk 命令

我们将通过研究不同类型的字符串匹配问题来采用另一种方法来解决这个问题。

使用 cut 命令

"field"命令是处理字段相关数据的实用工具。

我们快速看一下我们的问题。我们有一个用逗号分隔的输入值。我们想从该列表中获取第三项。

我们可以使用 awk 将行拆分为多个字段,并以逗号 (,-) 作为分隔符,然后打印出第三个字段 (-f3)。

$ cut -d , -f 3 <<< "Eric,Male,28,USA"
28

我们达到了预期的结果并解决了问题。

使用 awk 命令

Awk 也擅长处理基于字段的输入。一个简洁的 awkish 单行代码就可以解决这个问题。

$ awk -F',' '{print $3}' <<< "Eric,Male,28,USA"
28

此外,由于 awk 的字段分隔符 (FS) 支持正则表达式,我们可以使用 awk 构建更通用的解决方案。

因此,"C"选项并不是解决这个问题的好选择。它只支持使用一个字符作为字段分隔符。

使用 awk 仍然很容易。

$ awk -F', ' '{print $3}' <<< "Eric, Male, 28, USA"
28

您可以使用 awk 命令在这两种情况下工作。这在现实世界中可能是一个方便的技巧。

$ awk -F', ?' '{print $3}' <<< "Eric, Male, 28, USA"
28
$ awk -F', ?' '{print $3}' <<< "Eric,Male,28,USA"
28

另一种基于模式的子字符串案例

我们已经处理过"Eric 的生日"问题。现在我们来看另一个例子。

虽然理论上,模式匹配的子字符串应该出现在 CSV 文件中,但情况并非总是如此。为了演示,我们来看一个例子。

Awk 是解决此类问题的绝佳工具。但是,它并不总是使用 cut 命令。

现在让我们看看如何使用 awk 来解决这个问题。我们将输入字符串存储到名为 $STR 的变量中,以便我们的命令更易于阅读。

$ STR="whatever dataBEGIN:Interesting dataEND:something else"
$ awk -F'BEGIN:|END:' '{print $2}' <<< "$STR"
Interesting data
$ awk '{ sub(/.*BEGIN:/, ""); sub(/END:.*/, ""); print }' <<< "$STR"
Interesting data

第一个 awk 语句将每行的开头(或结尾)设置为分隔符,然后获取第二列。

执行这两个替换后,我们的最终输出将是所需的输出。我们只需要显示它。

结论

文本处理是 Linux 的重要组成部分。根据需要,可以通过模式或索引相关的参数确定特定的子字符串。

通过示例,我们了解了如何从两种类型的字符串中提取子字符串。


相关文章


有用资源