2

我想从字符串中提取多个可变长度。

字符串如下所示:

used_memory:1775220696

我想把1775220696零件放在一个变量中。关于这个有很多问题,但我找不到适合我需要的解决方案。

4

7 回答 7

9

您可以使用cut

my_val=$(echo "used_memory:1775220696"  | cut -d':' -f2)

或者也awk

my_val=$(echo "used_memory:1775220696"  | awk -F':' '{print $2}')
于 2013-04-15T12:51:57.640 回答
6

使用参数扩展:

string=used_memory:1775220696
num=${string#*:}              # Delete everything up to the first colon.
于 2013-04-15T12:54:10.793 回答
5

我曾经使用 egrep

echo used_memory:1775220696 | egrep -o [0-9]+

输出:

1775220696
于 2015-12-29T08:44:36.390 回答
2

使用正则表达式:

s/^[^:]*://g

您将它与 sed 或 perl 一起使用并获得所需的部分。

> echo "used_memory:1775220696" | perl -pe 's/^[^:]*://g'
1775220696
于 2013-04-15T13:02:56.727 回答
2

bash支持正则表达式匹配,但对于像这样的简单情况,它是多余的;使用参数扩展(参见choroba 的答案)。

为了完整起见,下面是一个使用正则表达式匹配的示例:

[[ $string =~ (.*):([[:digit:]]+) ]] && num=${BASH_REMATCH[2]}
于 2013-04-15T15:15:54.513 回答
1

可以使用 awk 完成,如下所示:

var=`echo "used_memory:1775220696" | awk -F':' '{print $2;}'`
echo $var

输出:

1775220696
于 2013-04-15T12:55:00.007 回答
0

如果您的数字可以在字符串中的任何位置,但您知道数字是连续的,则可以使用 shell 参数扩展来删除所有不是数字的内容:

$ str=used_memory:1775220696
$ num=${str//[!0-9]}
$ echo "$num"
1775220696

这也适用于used_memory:1775220696andmoretext123numberfirst。但是,类似的东西abc123def456会变成123456.

于 2017-01-06T06:17:32.330 回答