使用Linux bash提取子串
描述
从一个字符串中提取子串是Linux中文本处理的一个基本和常见的操作。
我们在这里看一下使用Linux命令行从字符串中提取子字符串的不同方法。
提取一个基于索引的子串
让我们首先快速浏览一下如何使用四种不同的方法来提取基于索引的子串。
- 使用cut命令
-
使用awk命令
-
使用Bash的子串扩展
-
使用expr命令
接下来,我们将看到他们在行动。
使用切割命令
我们可以使用 “剪切 “命令从输入字符串中提取从位置N开始到位置M的字符。
为了使用剪切命令来解决我们的问题,我们必须在起始索引上加1,在结束索引上减1。因此,新的区间将分别为4-8和9-13。
现在,我们来看看剪切命令是否解决了这个问题。
$ 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解决方案起了作用。
提取一个基于模式的子串
现在我们要探索模式-子串,除了我们已经学过的索引子串之外。
我们将讨论两种方法来解决我们的问题:一种方法,我们将
- 使用剪切命令
-
使用awk命令
我们将采取另一种方法来解决这个问题,看一看不同类型的字符串匹配问题。
使用 “cut”命令
“字段 “命令是处理字段相关数据的有用工具。
让我们快速看一下我们的问题。我们有一个由逗号分隔的输入值。我们想从这个列表中得到第三个项目。
我们可以用awk把这一行分成几个字段,用逗号(,-)作为分隔符,然后打印出第三个字段(-f3)。
$ cut -d , -f 3 <<< "Eric,Male,28,USA"
28
我们达到了预期的效果,解决了问题。
使用awk命令
Awks也擅长处理基于字段的输入。一个紧凑的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
一个不同的基于模式的子串案例
我们已经处理了 “埃里克的生日 “的问题。现在我们来看看另一个问题。
尽管从理论上讲,模式匹配的子串应该出现在CSV文件中,但情况可能并不总是如此。作为示范,让我们看一个例子。
Awk是解决这种挑战的优秀工具。然而,它并不总是使用剪切命令。
现在我们来看看如何用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的一个关键组成部分。根据需要,可以通过模式或索引相关的参数来确定具体的子字符串。
通过实例,我们已经了解了如何从这两种类型的字符串中提取子串。