如何使用'cut'找到最后一个字段

noo*_*der 266 linux bash cut

使用sed使用awk,当字段数量未知或每行更改时,如何获取最后一个字段? cut

zed*_*xus 584

你可以尝试这样的事情:

echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
Run Code Online (Sandbox Code Playgroud)

说明

  • maps.google.com的反向将是 moc.elgoog.spam
  • cut 使用点作为分隔符并选择第一个字段,即 moc
  • 最后,我们再次扭转它(感谢提醒,@ tom) com

  • 双'rev`伟大的理想! (12认同)
  • @tom OP在过去几个小时内提出的问题多于此问题.根据我们与OP的互动,我们知道awk/sed/etc.他的作业不允许,但尚未提及转速.所以值得一试 (7认同)
  • 它不仅仅使用`cut`而是没有'sed`或`awk`.那么OP的想法是什么? (5认同)
  • 真棒,简单,完美,也要感谢解释 - 没有足够的人解释管道命令的长链中的每一步 (5认同)
  • @zfus我明白了.之后可能想再坚持另一个`rev`. (4认同)
  • @zfus我认为你还需要另一个`rev`,因为在'echo'www.google.com'|这样的条件下 转| 切-d'.' -f 1 | rev`. (2认同)

Cha*_*ffy 115

使用参数扩展.这比包含的任何类型的外部命令cut(或grep)更有效.

data=foo,bar,baz,qux
last=${data##*,}
Run Code Online (Sandbox Code Playgroud)

有关bash中本机字符串操作的介绍,请参阅BashFAQ#100.

  • 这怎么不是最受欢迎的答案?!:-) (11认同)
  • @ErwinWessels:因为bash真的很慢.使用bash运行管道,而不是批量处理数据.我的意思是,如果你已经在shell变量中有一行文本,或者你想做`IFS = read -ra array_var; do :;完成<(cmd)`来处理几行.但对于一个大文件,rev | cut | rev可能更快!(当然,awk会比那更快.) (3认同)
  • @PeterCordes,对于大文件,awk肯定会更快,但要克服恒定因素的启动成本,它需要花费大量的输入。(还存在一些shell,例如ksh93,其性能接近awk,此答案中给出的语法仍然有效; bash异常缓慢,但它甚至与可用的唯一选项都不接近)。 (2认同)
  • 这是迄今为止在`bash` 脚本中修剪单个变量的最快和最简洁的方法(假设您已经在使用`bash` 脚本)。无需外部调用任何东西。 (2认同)

tom*_*tom 80

使用它是不可能的cut.这是一种使用方式grep:

grep -o '[^,]*$'
Run Code Online (Sandbox Code Playgroud)

替换其他分隔符的逗号.

  • 我试图在MinGW上做这个,但是我的grep版本不支持-o,所以我使用`sed'/^.*,//'`用空字符串替换所有字符,包括最后一个逗号. (3认同)
  • 要做相反的事情,找到除了最后一个字段之外的所有内容:`grep -o'^.*,'` (2认同)
  • 这特别有用,因为在我的情况下,`rev` 添加了一个问题多字节 unicode 字符。 (2认同)

Ami*_*ler 31

没有awk?...但是用awk这么简单:

echo 'maps.google.com' | awk -F. '{print $NF}'
Run Code Online (Sandbox Code Playgroud)

AWK是一种更强大的工具,可放在口袋里.-F如果用于字段分隔符NF是字段数(也代表最后一个的索引)

  • 这是通用的,每次都按预期工作。在这种情况下,使用 `cut` 来实现 OP 的最终输出就像使用勺子“切”牛排(双关语:))。`awk` 是牛排刀。 (5认同)
  • 避免不必要地使用 `echo`,这可能会使用 `awk -F 减慢长文件的脚本速度。'{print $NF}' &lt;&lt;&lt; 'maps.google.com'`。 (5认同)

小智 13

有多种方式.你也可以使用它.

echo "Your string here"| tr ' ' '\n' | tail -n1
> here
Run Code Online (Sandbox Code Playgroud)

显然,tr命令的空格输入应该用你需要的分隔符替换.


小智 7

这是唯一可以使用除切割之外的解决方案:

echo"string"| 切-d'.' -f2- [repeat_following_part_forever_or_until_out_of_memory:] | 切-d'.' -f2-

使用这种解决方案,字段的数量确实是未知的,并且不时变化.但是,由于行长度不得超过LINE_MAX字符或字段(包括换行符),因此任意数量的字段都不能成为此解决方案的真实条件.

是的,这是一个非常愚蠢的解决方案,但是我认为唯一符合标准的解决方案.

  • 尼斯.拿最后一个'.' 关闭"字符串",这是有效的. (2认同)
  • 我喜欢当每个人都说某些事情是不可能的,然后有人会用一个有效的答案来表达.即使它确实非常愚蠢. (2认同)

Mas*_*oob 6

最好awk在处理表格数据时使用。如果可以通过 实现awk,为什么不使用它呢?我建议您不要浪费宝贵的时间,并使用少量命令来完成工作。

例子:

# $NF refers to the last column in awk
ll | awk '{print $NF}'
Run Code Online (Sandbox Code Playgroud)