如何在Shell中从最后一行到第一行读取文件并反向打印指定行数?
嘿,这个需求在Shell里有好几种实用的实现方式,我给你分享几个常用的方案:
方法1:用
tac + head(最直观高效) tac是专门用来反向输出文件内容的工具,它会直接把文件从最后一行到第一行打印出来。如果要限制最多输出50行,搭配head截取前50行就完美解决:
tac your_file.txt | head -n 50
举个实际例子,假设你的文件test.txt内容是:
ant ball cat dog elephant
执行命令后会输出:
elephant dog cat ball ant
如果文件本身行数少于50,命令会自动输出所有行的反向内容,完全符合你的需求。
方法2:用
sed实现(兼容无tac的老系统) 有些老旧的Unix系统可能没有tac命令,这时候可以用sed的脚本实现反向读取,同样搭配head限制行数:
sed '!G;h;$!d' your_file.txt | head -n 50
简单解释下这个sed脚本的逻辑:
!G:除最后一行外,把保持空间的内容追加到当前行后面h:把当前行的内容复制到保持空间$!d:除最后一行外,删除当前行的内容
最终就能实现文件内容的反向输出。
方法3:用
awk自定义逻辑(灵活可控) 如果需要更灵活的控制,比如自定义输出行数的计算,awk是个好选择。思路是先把所有行存入数组,再从最后一行开始往前遍历,最多输出50行:
awk '{lines[NR] = $0} END {for (i=NR; i>=max(1, NR-49); i--) print lines[i]}' your_file.txt
这里NR是当前处理的行号,max(1, NR-49)保证了当文件行数不足50时,不会出现负数索引,会从第一行开始反向输出所有内容。
内容的提问来源于stack exchange,提问作者Paiya
相关产品推荐
相关产品推荐

