我有一个日志行,我正在从bash中提取:
There are 5 apples and 7 oranges
我希望将5和7变为bash变量并且遇到问题。
awk'{print $ 3,$ 6}'由于他们的位置可能会改变,如果有香蕉这样的事实将无法运作。如果数字可以与他们的成果相关联,则奖励积分。
提前致谢
答案 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映射。