从bash命令shell中解析一行中的数字

时间:2011-09-07 18:36:38

标签: bash

我有一个日志行,我正在从bash中提取:

There are 5 apples and 7 oranges

我希望将5和7变为bash变量并且遇到问题。

awk'{print $ 3,$ 6}'由于他们的位置可能会改变,如果有香蕉这样的事实将无法运作。如果数字可以与他们的成果相关联,则奖励积分。

提前致谢

5 个答案:

答案 0 :(得分:2)

并获得成果:

echo 'There are 5 apples and 7 oranges' | grep -o -E '[[:digit:]]+ [[:alpha:]]+'

答案 1 :(得分:1)

使用bash v4测试的仅限bash的方法:

str=" There are 5 apples, 12 bananas and 7 oranges"

i=0
while [[ "$str" =~ ([0-9]+)" "([a-z]+)(.*) ]] ; do
    num[$i]=${BASH_REMATCH[1]}
    type[$i]=${BASH_REMATCH[2]}
    str=${BASH_REMATCH[3]}
    (( i++ ))
done

for (( i=0; i<${#num[@]}; i++ )); do
    printf "%4d\t%s\t%s\n" $i ${num[$i]} ${type[$i]}
done

输出

   0    5       apples
   1    12      bananas
   2    7       oranges

答案 2 :(得分:0)

Grep会这样做:

echo 'There are 5 apples and 7 oranges' | grep -o -E '[[:digit:]]+'

答案 3 :(得分:0)

稍微紧凑的版本:

echo 'There are 5 apples and 7 oranges' | egrep -o '[0-9]+ \w+'

但请注意\w[:alnum:]同义,因此也会匹配“appl3s”。

答案 4 :(得分:0)

好吧,shell是一种奇怪的语言,你可以做很好的事情。例如:

a="there are 7 apples"
for i in $a; do
  case $i in
    [0-9]*)
      value=$i
      expectname=1
    ;;
    *)
      test -n "$expectname" && name=$i
      expectname=
    ;;
  esac
done

echo $value
echo $name

如果您有多个匹配项,则可以填充数组或bash映射。