Perl shell one-liner:选择stdin最后一行的最后一个字段

时间:2013-03-31 02:56:43

标签: perl

给出这样的输出:

-rw-r--r--   1 tinosino  staff   4.0K 21 Mar  2012 EtcHosts_Backup_2012-03-21_21-19-10.txt
-rw-r--r--   1 tinosino  staff   3.8K  1 Apr  2012 EtcHosts_Backup_2012-04-01_01-06-12.txt
-rw-r--r--   1 tinosino  staff   3.9K 18 Jun  2012 EtcHosts_Backup_2012-06-18_18-33-40.txt
-rw-r--r--   1 tinosino  staff   3.9K 27 Aug  2012 EtcHosts_Backup_2012-08-27_09-37-44.txt

我想得到最后一行(8月27日)的最后一个字段(文件名),基本上是:

EtcHosts_Backup_2012-08-27_09-37-44.txt

我感兴趣的是如何在perl中做到最好。

如果只有ls有更好的方法来实现这一点,那就不是我想要的了(我知道我可以按日期,创建,修改等排序,我可以{{1}只显示文件名)

这主要是关于如何在-1t perl中学习如何做的事情:

awk

,并提供:

ll | tail -n 1 | awk '{print $NF}'

这是“理想的答案”。

这是我的尝试:

EtcHosts_Backup_2012-08-27_09-37-44.txt

我可以改进这个看起来丑陋的...... F? ll | perl -lane 'eof() && print $F[$#F]'

答案“似乎是正确的”,但获得$ NF的方式似乎是原始的。

2 个答案:

答案 0 :(得分:1)

改进:

perl -lane 'eof() && print $F[-1]'  # or ...
perl -lane 'eof() && print pop @F'

此外:

perl -lane 'END { print $F[-1] }'   # or...
perl -lane 'END { print pop @F }'

当然,为什么不呢:

ls | tail -1

答案 1 :(得分:1)

要回答有关改进$F[$#F]的具体问题,Perl支持使用负数作为数组索引。例如,-1表示列表的最后一个元素,因此您可以将单行编写为:

ll | perl -lane 'eof() && print $F[-1]'