这很简单,简短,并且易于编写,理解和检查,我个人很喜欢:
grep -oE '\S+$' file
grep
在Ubuntu中,当用-E
或调用时-P
,用速记 \s
表示空格字符(实际上通常是空格或制表符),\S
而表示不属于此的任何字符。使用量词+
和行尾锚$
,该模式将\S+$
匹配行尾的一个或多个非空白。您可以使用-P
代替-E
; 在这种情况下,含义是相同的,但是使用了不同的正则表达式引擎,因此它们可能具有不同的性能特征。
这等效于Avinash Raj的注释解决方案(只是使用了更简单,更紧凑的语法):
grep -o '[^[:space:]]\+$' file
如果数字后面可能存在尾随空格,则这些方法将行不通。可以对其进行修改,以便进行修改,但我认为此处没有意义。尽管有时将解决方案推广到更多情况下是有启发性的,但这样做似乎不像人们通常想象的那么频繁,因为通常没有办法知道问题最终可能需要以多种不同的不兼容方式中的哪一种来解决。被概括。
性能有时是一个重要的考虑因素。这个问题并不能说明输入的内容是否很大,并且这里发布的每个方法都可能足够快。但是,如果需要速度,这是一千万个行输入文件的小基准:
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
我运行了两次,以防顺序很重要(有时对于处理I / O繁重的任务也是如此),并且因为我没有一台可以在后台执行其他操作而导致结果不正确的机器。根据这些结果,至少对于我使用的大小的输入文件,我至少得出以下结论:
哇!传递-P
(以使用PCRE),而不是-G
或(当没有指定方言默认)-E
提出grep
通过更快了一个数量级。因此,对于大文件,使用此命令可能比上面显示的命令更好:
grep -oP '\S+$' file
哇!!αғsнιη的答案,中的cut
方法比我的方法中更快的版本还要快一个数量级!它也是pa4080基准测试的获胜者,该基准测试涵盖了更多方法,但输入量却更少-这就是为什么我选择了所有其他方法中的方法,将其包括在测试中。如果性能很重要或文件很大,我认为应该使用αғsнιη的方法。cut -d= -f2 file
cut
这也提醒我们,不要忘记简单cut
和paste
实用程序,并且在适用时应该首选简单和实用程序,即使grep
通常将这类更复杂的工具作为一线解决方案提供(我个人比较习惯)使用)。
grep -o '[^[:space:]]\+$' file