我有这个变量:
A="Some variable has value abc.123"
我需要提取这个值,即abc.123
。这在bash中可能吗?
最简单的是
echo $A | awk '{print $NF}'
编辑:解释这是如何工作的......
awk
将输入分成不同的字段,默认使用空格作为分隔符。硬编码5
代替NF
打印输入中的第 5 个字段:
echo $A | awk '{print $5}'
NF
是一个内置awk
变量,它给出当前记录中的字段总数。以下返回数字 5,因为字符串中有 5 个字段"Some variable has value abc.123"
:
echo $A | awk '{print NF}'
结合输出字符串$
中NF
的最后一个字段,无论您的字符串包含多少个字段。
是的; 这个:
A="Some variable has value abc.123"
echo "${A##* }"
将打印:
abc.123
(该符号在Bash 参考手册的第 3.5.3 节“Shell 参数扩展”中进行了解释。)${parameter##word}
使用参数扩展的一些示例
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
阅读更多外壳参数扩展
你怎么知道价值从哪里开始?如果总是第 5 个和第 6 个单词,您可以使用例如:
B=$(echo $A | cut -d ' ' -f 5-)
这使用cut
命令切出部分行,使用简单的空格作为单词分隔符。
该文档阅读起来有点痛苦,因此我以更简单的方式对其进行了总结。
请注意,“ *
”需要与“”交换位置,
具体取决于您使用#
或%
。(这*
只是一个通配符,因此您可能需要在阅读时摘下“正则表达式帽子”。)
${A% *}
- 删除最短的尾随 *
(去掉最后一个字)${A%% *}
- 删除最长的尾随 *
(去掉最后的话)${A#* }
- 删除最短的前导*
(去掉第一个单词)${A##* }
- 删除最长的前导*
(去掉第一个单词)当然,这里的“单词”可能包含任何不是文字空间的字符。
您可能通常使用此语法来修剪文件名:
${A##*/}
删除所有包含的文件夹(例如/usr/bin/git
-> git
)${A%.*}
删除最后一个扩展名(例如archive.tar.gz
-> archive.tar
) - 请注意以下内容my.path/noext
正如 Zedfoxus在这里指出的那样。一种非常干净的方法,适用于所有基于 Unix 的系统。此外,您不需要知道子字符串的确切位置。
A="Some variable has value abc.123"
echo $A | rev | cut -d ' ' -f 1 | rev
# abc.123