如何提取字符串中的最后一个字段?

时间:2017-02-05 17:31:55

标签: bash

如何提取字符串中的最后一个字段?我有一个字符串:

xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1

我想提取字符串的最后一部分,即VGA1

5 个答案:

答案 0 :(得分:0)

如果字符串有分隔符,您可以使用revcut,如您所示:

var="xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1"
rev <<< "$var" | cut -f1 -d' ' | rev
# output => VGA1
  • 第一个rev反转字符串,以便最后一个标记转移到开头,但反过来
  • cut -f1提取第一个字段,使用空格作为分隔符
  • 第二个rev将提取的字段反转为其原始状态

此解决方案的好处在于它并不依赖于最后一个令牌之前的字段数。

相关文章:How to find the last field using 'cut'

答案 1 :(得分:0)

如果此字符串始终包含相同数量的空格,我们可以将每个以空格分隔的部分视为字段,并使用cut来提取它:

$ echo "xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1" | cut -d' ' -f7
VGA1

如果情况并非如此,我们可以使用正则表达式从结尾进行匹配,例如使用grep

$ echo "xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1" | grep -o '[^ ]*$'
VGA1

答案 2 :(得分:0)

使用Bash builtins(无外部命令)的一种方法:

var="xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1"
[[ "$var" =~ [[:space:]]([^[:space:]]+)([[:space:]]*)$ ]]
match="${BASH_REMATCH[1]-}"

请注意,使用的正则表达式将容忍字符串中的尾部空格;它可以简化,以避免它被认为是一个错误而不是一个功能:

[[ "$var" =~ [[:space:]]([^[:space:]]+)$ ]]

答案 3 :(得分:0)

我采取了不同的方法:

echo "xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1" | \
sed 's/ /\
/g' | tail -n1

答案 4 :(得分:0)

我只想使用awk:

$ awk '{print $NF}' <<< 'xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1'
VGA1

NF是记录中的字段数,$NF打印的数字为NF的字段,即最后一个字段。默认情况下,字段为空白分隔。

或者,使用shell参数扩展:

$ str='xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1'
$ echo "${str##* }"
VGA1

这将从头开始删除最长的匹配字符串,其中匹配的模式为* :“任何内容,后跟空格”。