如何在bash中提取字符串的最后一部分?

时间:2012-09-14 14:35:17

标签: string bash awk

我有变量:

A="Some variable has value abc.123"

我需要提取这个值,即abc.123。在bash中这可能吗?

6 个答案:

答案 0 :(得分:68)

最简单的是

echo $A | awk '{print $NF}'

编辑:解释其工作原理......

awk将输入分为不同的字段,默认情况下使用空格作为分隔符。硬编码5代替NF打印出输入中的第5个字段:

echo $A | awk '{print $5}'

NF是一个内置的awk变量,它给出了当前记录中的字段总数。以下返回数字5,因为字符串"Some variable has value abc.123"中有5个字段:

echo $A | awk '{print NF}'

$NF组合在一起输出字符串中的最后一个字段,无论字符串包含多少字段。

答案 1 :(得分:31)

是;这样:

A="Some variable has value abc.123"
echo "${A##* }"

将打印出来:

abc.123

§3.5.3 "Shell Parameter Expansion" of the Bash Reference Manual中解释了${parameter##word}表示法。)

答案 2 :(得分:9)

使用参数扩展的一些示例

A="Some variable has value abc.123"
echo "${A##* }"

abc.123

“”空间

的最长匹配
echo "${A% *}"

Some variable has value

最长的比赛。点

echo "${A%.*}"

Some variable has value abc

“”空间最短匹配

echo "${A%% *}"

some

了解更多Shell-Parameter-Expansion

答案 3 :(得分:8)

你怎么知道价值从哪里开始?如果它总是第5和第6个单词,你可以使用例如:

B=$(echo $A | cut -d ' ' -f 5-)

这使用cut命令切出部分行,使用简单空格作为单词分隔符。

答案 4 :(得分:5)

JSR223 Test Elements读起来有点痛苦,所以我以一种更简单的方式对其进行了总结。

请注意,取决于您使用*还是,“ #”需要与“ %”交换位置。 (*只是一个通配符,因此您在阅读时可能需要摘下“ regex帽子”。)

  • ${A%% *}-删除最长的结尾 *(仅保留第一个单词
  • ${A% *}-删除结尾最短的 *(保留除最后一个单词外的所有
  • ${A##* }-删除最长的前导* (仅保留姓氏
  • ${A#* }-删除最短的前导* (保留除第一个单词外的所有字符

当然这里的“单词”可以包含不是文字空间的任何字符。

答案 5 :(得分:1)

如Zedfoxus here所指出。在所有基于Unix的系统上都可以使用的非常干净的方法。此外,您不需要知道子字符串的确切位置。

A="Some variable has value abc.123"

echo $A | rev | cut -d ' ' -f 1 | rev                                                                                            

# abc.123