Perl shell一行代码:选择stdin最后一行的最后一个字段



给出如下输出:

-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

我想获得最后一行(27 Aug)的最后一个字段(文件名),基本上:

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

我对如何在perl中最好地做到这一点很感兴趣。

如果有一个更好的方法来做到这一点,只是ls,这不是我要找的(我知道我可以按日期,创建,修改等排序,我可以-1t只是显示文件名)

这基本上是关于学习如何在perl中做我通常在awk中做的事情:

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

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

哪个是"想要的答案"

这是我的尝试:

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

我能改进一下这个难看的…F ?$F[$#F]

答案"似乎是正确的",但是获取$NF的方法似乎是原始的。

改进:

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

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

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

最新更新