如何在shell脚本

时间:2017-02-10 21:38:31

标签: string shell awk

我有这一行:

102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=79.500000,lat=9.000000,val=-5.35

现在我想从这一行打印值-5.35而不是别的。

我也希望这个命令能够从这一行中提取-7.04而不是其他内容。

102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=280.500000,lat=11.000000,val=-7.04

我已经阅读了其他堆栈溢出问题,他们似乎没有完全了解我正在寻找的东西。我注意到他们你做了awk或sed。在val =?

之后,我应该做些什么类型的事情才能提取上述行的一部分

3 个答案:

答案 0 :(得分:2)

不需要awksed或任何其他外部工具:bash有自己的内置正则表达式支持,通过=~运算符[[ ]] ,以及BASH_REMATCH数组(填充了匹配的内容)。

val_re='[, ]val=([^ ]+)'
line='102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=79.500000,lat=9.000000,val=-5.35'
[[ $line =~ $val_re ]] && echo "${BASH_REMATCH[1]}"

也就是说,如果你真的希望删除所有字符串val=并将其包括在内,那么如果将来其他值添加到格式中则会导致代码中断),你也可以这样做:

val=${line##*val=}  # assign everything from $line after the last instance of "val=" to val

此处的语法为parameter expansion。另请参阅BashFAQ #100: How do I do string manipulations in bash?

答案 1 :(得分:1)

您可以将awk与字段分隔符一起用作=并打印最后一个字段:

awk -F'=' '{print $NF}' <<< "$str"

-5.35

答案 2 :(得分:0)

这将从末尾搜索字符串val =并在此之后给出任何内容

str='102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=79.500000,lat=9.000000,val=-5.35'

echo "$str" | grep -Po '(?<=val=).*'

回答仅适用于GNU grep