如何从shell变量中获取最新单词而不循环遍历所有单词?

时间:2011-12-20 09:45:29

标签: shell sh

我想从字符串变量中获取两个最新单词。 字符串变量中的单词总数不是常量。

这是我尝试的:

LIST=`some command`
LATEST1=""
LATEST2=""

for ITEM in $LIST
do
  LATEST2="$LATEST1"
  LATEST1="$ITEM"
done

echo "Latest:     $LATEST1"
echo "2nd latest: $LATEST2"

但它很慢。有没有更好的方法呢?

使用了busybox的shell。其他脚本语言不可用。

4 个答案:

答案 0 :(得分:2)

您可以使用参数替换:

words="one two three four"
last=${words##* }
echo $last  # => four
tmp=${words% *}
last2=${tmp##* }
echo $last2  # => three

答案 1 :(得分:1)

$ echo -e 'hello world\nhow are you' | 
tr '\n' ' ' | 
awk '
END{if(NF>1)printf("Latest:\t\t%s\n2nd latest:\t%s\n", $NF, $(NF-1)); else print "ERROR"}'
Latest:         you
2nd latest:     are

答案 2 :(得分:1)

正则表达式将匹配最后2个单词(在这种情况下包括空格)

(\s\w+){2}$

答案 3 :(得分:0)

您可以使用以下内容以纯shell方式执行此操作:

words="one two three four"

words=($words)

echo ${words[${#words}]}            # prints 'four'
echo ${words[((${#words} - 1))]}    # prints 'three'

这可以通过将包含字符串的变量分配到数组中然后通过键访问它来实现。