如何用sed命令打印文件的倒数第二行记录?
只用sed打印文件倒数第二行的方法
没问题,我来分享几种纯sed实现的方案,完全不需要依赖head或tail命令:
方法1:利用保持空间缓存前一行
这是最常用的经典写法,核心思路是用sed的保持空间(hold space)持续缓存上一行内容,当处理到最后一行时,打印缓存的那行:
sed -n '${x;p};x' filedata
命令拆解:
x:每次处理一行时,先交换模式空间(当前正在处理的行)和保持空间的内容,这样保持空间里始终存着上一行的内容${x;p}:当处理到最后一行($匹配最后一行)时,再次交换空间(此时保持空间里是倒数第二行),然后执行p打印这行-n:关闭sed默认的每行打印行为,只打印我们指定的内容
方法2:简化版保持空间写法
这个写法逻辑更直观,只在非最后一行时缓存内容,最后一行直接输出缓存的行:
sed '$!{h;d};x' filedata
命令拆解:
$!{h;d}:对不是最后一行的所有行,执行h(把当前行存入保持空间),然后d(删除模式空间内容,跳过默认打印)- 当处理到最后一行时,执行
x交换保持空间和模式空间,此时模式空间里是倒数第二行,sed默认会打印模式空间的内容,所以不用加-n
方法3:用N+P+D组合保留最后两行
这个方法通过持续读取新行并保留最后两行,最后只打印倒数第二行:
sed -n 'N;${P};D' filedata
命令拆解:
N:读取下一行到模式空间,和当前行合并成“行1\n行2”的格式${P}:当处理到最后一行时,打印模式空间的第一部分(也就是换行符之前的内容,即倒数第二行)D:删除模式空间的第一部分(换行符之前的内容),然后回到循环开头继续处理剩下的内容,这样模式空间始终只保留最后两行
测试示例
假设filedata内容如下:
line 1 line 2 line 3 line 4 line 5
执行上面任意一个命令,都会输出:line 4
内容的提问来源于stack exchange,提问作者Naveen Kumar
相关产品推荐
相关产品推荐

