是否有(POSIX命令行)的方式来打印所有的文件,除了最后n行?用例,我将有多个未知大小的文件,所有这些文件都包含已知大小的样板页脚,我想删除它们。我想知道是否已经有一个实用程序在自己写之前执行此操作。尾部反转/打印除最后n行之外的所有内容?
回答
大多数版本的头(1) - GNU派生的,特别是但不是BSD派生的 - 具有执行此操作的功能。如果您使用负数来打印行数,它将显示除文件结尾以外的文件顶部。
像这样:
head -n -10 textfile
如果页脚与不在别处出现一致的行开始,你可以使用sed
:
sed '/FIRST_LINE_OF_FOOTER/q' filename
那打印页脚的第一行;如果你想避免:
sed -n '/FIRST_LINE_OF_FOOTER/q;p' filename
这可能是比计数行更加健壮如果在未来页脚的大小变化。 (或者如果第一行改变,它可能不够健壮。)
如果系统的head
命令不支持head -n -10
,另一种方法是预先计算要显示的行数。下面依赖于特定的bash语法:
lines=$(wc -l < filename) ; ((lines -= 10)) ; head -$lines filename
注意,head -NUMBER
语法是由head
为了向后兼容某些版本的支持; POSIX只允许head -n NUMBER
表单。 POSIX也只允许-n
的参数为正整数; head -n 0
不一定是空白。
一种解决方案是:
lines=$(wc -l < filename) ; lines=$(($lines - 10)) ; head -n $lines filename
如果您需要处理古预POSIX炮弹,你可能会考虑这一点:
lines=`wc -l < filename` ; lines=`expr $lines - 10` ; head -n $lines filename
所有的这些可能,如果做奇怪的事情一个文件长度不超过10行。
除了用于命令替换的古代反引号外,POSIX还具有更为清晰的'$(...)'语法,它还具有$ ((...))'算术扩展。所以没必要用反引号和'expr'去古代。 [POSIX命令替换](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03) – geirha 2012-08-06 21:36:58
@geirha:好的一点,这个问题特别提到了POSIX。但是如果有任何POSIX之前的shell仍在使用中,那么了解古代语法可能会有用。 – 2012-08-06 22:02:14
没有标准的命令可以做到这一点,但是您可以使用awk或sed填充缓冲区线,并在头部打印完成后从头部打印。例如。使用awk:
awk -v n=5 '{if(NR>n) print a[NR%n]; a[NR%n]=$0}' file
可能比“WC” +“做数学” +“尾巴”的方法效率较低,而且更容易查看:
tail -r file.txt | tail +NUM | tail -r
哪里NUM
比一个更您要删除的结束行数,例如+11将打印除最后10行外的所有内容。这适用于不支持head -n -NUM
语法的BSD。
这很简单。您必须将+添加到您想要避免的行数。
这个例子给你除了第9
尾-n +10 inputfile中
所有行(是的,也不是第10 ...因为它计算不同...如果你想10,只需键入 tail -n 11 inputfile)
- 1. 删除除String的最后部分之外的所有内容吗?
- 2. 在所有内容之后打印静态内容
- 3. PHP脚本删除除最后n行之外的所有行文件
- 4. SQL为每个唯一值删除除最后N行之外的所有行
- 5. 打印最后n第1行之前没有行
- 6. 删除最后一个反斜杠后的所有内容
- 7. 打印第一列并打印%符号后的所有内容
- 8. 打印最后一行-n行输入
- 9. 匹配除了最后一个单词之外的所有内容
- 10. Rails破坏除最新的n条记录以外的所有内容
- 11. 打印字段'N'到行尾
- 12. 打印最后一个终端内容
- 13. 打印滚动DIV的所有内容
- 14. JS:删除第n个元素之间的所有内容
- 15. n行后停止打印
- 16. 删除字符串中除数字之外的所有内容
- 17. Nutch + Solr; SolrDeleteDuplicates删除除索引之外的所有内容
- 18. 记事本++:如何删除除url之外的所有内容?
- 19. 删除每个人的除最后一项以外的所有内容
- 20. 打印除第一个值之外的所有arrary值 - php
- 21. 删除除了某个标记及其内容之外的所有内容Python
- 22. 删除除记录中最后7个字符以外的所有内容
- 23. 是否有简洁的方式让awk打印除记录的第一个字段之外的所有内容?
- 24. Twitter Bootstrap - 打印所有标签内容
- 25. 在ScrollViewer中打印所有内容 - Silverlight
- 26. 输出不能打印所有内容?
- 27. 在R的最后一个下划线之后删除所有内容
- 28. 如何解决期待除''\ n''之外的任何内容;得到它反正
- 29. Drupal内容打印部分
- 30. 打印全部内容
但在POSIX中,-n必须是正整数。 – choroba 2012-08-06 19:53:37
对于严格的POSIX来说足够了。我应该更清楚我的“最”。如果你打算采用一种更加快速和肮脏的POSIX方法,我会假设'wc -l'加上一些数学会让你有一个值传递给'head' – 2012-08-06 20:06:00
head(1)的大部分实现都缺少这个特性。只有我知道的实现有这个不可移植的代码。 – 2014-05-07 21:23:27