有什么办法可以让 cut 命令只读取最后一个字段吗?

有什么办法可以让 cut 命令只读取最后一个字段吗?

我有一个空格分隔的字符串,它是通过命令输出的,我喜欢将其通过管道传输到cut,使用-fd ' '空格进行分隔。我知道我可以使用-f <n>来显示字段编号<n>,但如果我不知道字符串的长度,我可以让它显示最后一个字段吗?

或者我需要使用更灵活的文本编辑工具,如sedawk

答案1

不可以cut。您可以使用两个rev命令,例如

echo 'foo bar baz' | rev | cut -d' ' -f1 | rev

但通常使用起来更容易awk

echo 'foo bar baz' | awk '{print $(NF)}'

答案2

您可以仅使用 shell 来执行此操作,不需要任何外部工具,使用参数扩展:

${var##* }

var##*将丢弃从启动到参数(变量)的最后一个空间的所有内容var

如果分隔符可以是任何空格(例如空格或制表符),则使用字符类[:blank:]

${var##*[[:blank:]]}

例子:

$ var='foo bar spam egg'

$ echo "${var##* }"
egg


$ var=$'foo\tbar\tspam\tegg'

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg

答案3

我个人喜欢 Florian Diesch 的回答。但也有这种方法。

a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a

解释:

wc -w给出单词数。并cut删除最后一个单词

编辑:

我想到了另一种方法:

echo "Any random string here" | tac -s' ' | head -1

答案4

这是一个使用grep

$ echo "Change is Good" | grep -o '[^ ]*$'
Good

怎么运行的:

  • grep with-o仅打印匹配行的匹配(非空)部分。
  • 正则表达式[^ ]*$匹配从结尾开始的任何内容直到找到空格。

另一句台词来自格伦·杰克曼使用 perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good

相关内容