![有什么办法可以让 cut 命令只读取最后一个字段吗?](https://linux22.com/image/1088279/%E6%9C%89%E4%BB%80%E4%B9%88%E5%8A%9E%E6%B3%95%E5%8F%AF%E4%BB%A5%E8%AE%A9%20cut%20%E5%91%BD%E4%BB%A4%E5%8F%AA%E8%AF%BB%E5%8F%96%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E5%AD%97%E6%AE%B5%E5%90%97%EF%BC%9F.png)
我有一个空格分隔的字符串,它是通过命令输出的,我喜欢将其通过管道传输到cut
,使用-fd ' '
空格进行分隔。我知道我可以使用-f <n>
来显示字段编号<n>
,但如果我不知道字符串的长度,我可以让它显示最后一个字段吗?
或者我需要使用更灵活的文本编辑工具,如sed
或awk
?
答案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