I have a space seperated string which is output by a command, which I like to pipe to cut, using -fd ' ' to split on spaces. I know I can use -f <n> to display field number <n>, but can I make it display the last field if I don't know the length of the string?
Or do I need to use a more flexible text editing tool like sed or awk?
4 Answers
No cut can't do that. You could use two rev commands, like
echo 'foo bar baz' | rev | cut -d' ' -f1 | revbut it's usually easier to use awk:
echo 'foo bar baz' | awk '{print $(NF)}' You can do this using only shell, no external tool is needed, using Parameter Expansion:
${var##* }var##* will discard everything from start up to last space from parameter (variable) var.
If the delimiter can be any whitespace e.g. space or tab, use character class [:blank:]:
${var##*[[:blank:]]}Example:
$ var='foo bar spam egg'
$ echo "${var##* }"
egg
$ var=$'foo\tbar\tspam\tegg'
$ echo "$var"
foo bar spam egg
$ echo "${var##*[[:blank:]]}"
egg 1 I personally like Florian Diesch answer. But there is this way too.
a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$aExplanation:
wc -w gives the number of words. and cut cuts the last word
EDIT:
I figured another way of Doing it:
echo "Any random string here" | tac -s' ' | head -1 3 Here is one using grep
$ echo "Change is Good" | grep -o '[^ ]*$'
GoodHow it works:
- grep with
-oPrint only the matched (non-empty) parts of a matching line. - The regexp
[^ ]*$matches anything from end until it found a space.
Another one liner from glenn jackman using perl
$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good