是否有(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. 在所有內容之後打印靜態內容
- 2. SQL爲每個唯一值刪除除最後N行之外的所有行
- 3. 打印第一列並打印%符號後的所有內容
- 4. 打印最後一行-n行輸入
- 5. 匹配除了最後一個單詞之外的所有內容
- 6. 打印字段'N'到行尾
- 7. Rails破壞除最新的n條記錄以外的所有內容
- 8. 打印最後一個終端內容
- 9. JS:刪除第n個元素之間的所有內容
- 10. 記事本++:如何刪除除url之外的所有內容?
- 11. 打印除第一個值之外的所有arrary值 - php
- 12. 刪除除了某個標記及其內容之外的所有內容Python
- 13. 是否有簡潔的方式讓awk打印除記錄的第一個字段之外的所有內容?
- 14. 輸出不能打印所有內容?
- 15. 在R的最後一個下劃線之後刪除所有內容
- 16. 打印全部內容
- 17. Drupal內容打印部分
- 18. 刪除最後一個'\'後不工作的所有內容
- 19. 打印所有內容使用awk除了匹配範圍模式外
- 20. MySQL刪除之前的所有內容/
- 21. 迭代除UIContainerView之外的所有內容
- 22. HTML輸入模式:除URL之外的所有內容
- 23. 翻譯除帖子之外的所有內容
- 24. SQL查詢選擇除最大值以外的所有內容
- 25. Ansible,刪除X最新文件夾以外的所有內容
- 26. 在所有頁面結束後打印內容
- 27. Docker - 刪除除最後N個圖像以外的所有圖像
- 28. 刪除「?」後的所有內容python
- 29. 在':'之後匹配所有內容,直到第一個非空行,然後只匹配除空行外的所有內容
- 30. HIde除了使用CSS打印的特定部分以外的所有部分
但在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