распечатать последнее поле из строки + альтернатива для awk

Из-за технической причины на моей машине Solaris я не могу использовать awk для печати последнего поля в строке.

Каковы другие альтернативы awk которые печатают последнее поле из строки (используя cut или tr … и т. Д.)?

Пример 1:

 /usr/bin/hostname machine1b /usr/bin/hostname | /usr/bin/sed 's/\(.\{1\}\)/\1 /g' | /usr/bin/awk '{print $NF}' b 

Example2

 echo 1 2 3 4 5 | /usr/bin/awk '{print $NF}' 5 

Perl

 echo foo bar baz | perl -pe 's/.*[ \t]//' 

Если вам нужно сначала отделить трейлинг-пространства, сделайте следующее:

 echo "foo bar baz " | perl -lpe 's/\s*$//;s/.*\s//' 

В комментарии mr.spuratic внесено следующее:

 echo "foo bar baz " | perl -lane 'print $F[-1]' 

удар

 echo foo bar baz | while read i; do echo ${i##* }; done 

или bash не является вашей оболочкой по умолчанию:

 echo foo bar baz | bash -c 'while read i; do echo ${i##* }; done' 

Если вам нужно сначала снять одно конечное пространство, сделайте

 echo "foo bar baz " | while read i; do i="${i% }"; echo ${i##* }; done 

tr и tail

 echo foo bar baz | tr ' ' '\n' | tail -n1 

хотя это будет работать только для одной линии ввода, в отличие от решений выше. Подавление конечных пробелов в этом подходе:

 echo "foo bar baz " | tr ' ' '\n' | grep . | tail -n1 

Использование Cut:

Последнее поле:

 echo 1 2 3 4 5 | rev | cut -f1 -d ' ' 

Последний персонаж:

 echo 1 2 3 4 5 | rev | cut -c1 

echo hello my friend | tac -s' ' | tr '\n' ' ' | cut -d' ' -f 1

Что-то вроде этого должно работать:

sed -E -e 's/.* ([^ ]+)$/\1/'

 % echo 1 2 3 4 5 | sed -E -e 's/.* ([^ ]+)$/\1/' 5