根据定义,一行必须以换行符(\n
)(ref.)结尾。但就本文而言,无论是否以\n
结束,我都会将任何一系列字符视为一行。
命令tail -n 1
返回最后一行,无论它是否以\n
结尾。如何从文件中获取以\n
结尾的最后一行,无论该行是文件的最后一行还是倒数第二行?
答案 0 :(得分:6)
这是使用Perl的一种方法:
perl -ne '$s = $_ if /\n$/ }{ print $s' file
该脚本逐个读取文件的每一行,如果它以$s
结尾,则将其分配给变量\n
。读取文件后,将打印$s
。如果最后一行没有以换行结束,那么将打印倒数第二行,如下所示:
$ cat file
first line
second
third$ perl -ne '$s = $_ if /\n$/ }{ print $s' file
second
请注意,我故意留在$
中显示提示,由于缺少换行符,该提示位于文件最后一行的末尾。
答案 1 :(得分:5)
cat -vte file|grep "\$$"|tail -1
这个怎么样?或者用cat -vte
的其他方式这样就可以删除额外的$:
echo -en "Enter\nEnter again\nNo enter this time"|cat -vte|grep "\$$"|sed 's/\$$//g'|tail -1
Linux的+1变体(Perl regexp,正向前瞻断言,仅显示匹配部分):
echo -en "Enter\nEnter again\nNo enter this time"|cat -vte|grep -Po ".*(?=\\\$$)"|tail -1