有什么方法可以使cut命令仅读取最后一个字段?


11

我有一个由空格输出的字符串,该字符串由命令输出,我希望将其传递给cut-fd ' '用于分割空格。我知道我可以-f <n>用来显示字段号<n>,但是如果我不知道字符串的长度,可以使它显示最后一个字段吗?

还是我需要使用更灵活的文本编辑工具,例如sedawk


我认为cut命令不能支持,但不确定,您是否尝试过cut -d''-f-?
αғsнιη


@KasiyA -n从头开始使其为n,n-从n到末尾为n,并且存在使--complement选择反向的选项。但是据我所知,无法计数字段的数量并对其采取行动。
Arronical's

Answers:


12

没有,cut不能那样做。您可以使用两个rev命令,例如

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

但通常更容易使用awk

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

7

您可以仅使用Shell来执行此操作,而无需使用外部工具,可以使用Parameter Expansion:

${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

我曾在对Severus Tux答案的评论中谈到过使用参数扩展,但是空白字符类是有用的信息,谢谢。
Arronical

4

我个人很喜欢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

正确的,但是当DELIM是空格或制表符,这是真的,如果你切DELIM不一样的,这将失败
αғsнιη

很好的横向思考,尽管如果我要设置的话a="my string here",也可以使用参数扩展${a##* }
Arronical

1
是的,但是OP说他有一个用空格分隔的字符串。
Severus Tux

2

这是一个使用 grep

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

怎么运行的:

  • grep with -o仅打印匹配行的匹配(非空)部分。
  • regexp [^ ]*$从结尾匹配任何东西,直到找到一个空格。

格伦·杰克曼(Glenn Jackman)的另一个衬里使用Perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.