Bash:删除除最后n行之外的所有输入行

rup*_*pat 5 bash awk sed

我想删除除了最后一行或前n行之外的所有行,并使用短的单行

例如.:

---

aaaa

bbbb

cccc

dddd

cat/echo/find ...  | sed < all except last 2 lines > 
Run Code Online (Sandbox Code Playgroud)

应该结果

aaaa

bbbb

---

aaaa

bbbb

cccc

dddd

eeee

ffff

cat/echo/find ...  | sed < all except last 2 lines > 
Run Code Online (Sandbox Code Playgroud)

应该结果

aaaa

bbbb

cccc

dddd

---
Run Code Online (Sandbox Code Playgroud)

我也需要这个非常高的n.所以可以设置n = 100左右;)

Thanx任何帮助!

izo*_*ica 6

删除最后两行,您可以使用以下内容:

head -n $(($(wc -l < "$filename") - 2)) "$filename"
Run Code Online (Sandbox Code Playgroud)

不是很优雅,但它应该工作。我使用 wc -l 来计算行数,然后我使用 head 只显示第一个减去 2 行的行数。

编辑:只保留N你可以做的最后几行

tail -n $N $filename
Run Code Online (Sandbox Code Playgroud)

为了保持只有第一N,你可以做线。

head -n $N $filename
Run Code Online (Sandbox Code Playgroud)

看来我可能误解了您的问题,这就是我添加这两个命令的原因。

  • `wc -l &lt;​​ $filename` 将消除对 `cut` 的需要 (2认同)
  • 我建议您将 tic 改回括号,如下所示:`head -n $(($(wc -l &lt;​​ $filename) - 2)) $filename` (2认同)

小智 6

我想删除除最后 n 行之外的所有行

最简单的方法是(令 n=5):

tail -n5 $filename > $filename.tmp && mv $filename.tmp $filename
Run Code Online (Sandbox Code Playgroud)

这会将最后五行输出到新文件,然后重命名它。

如果任务相反 - 您需要所有行,但最后 5 行,您可以执行以下操作:

head -n$((`cat $filename | wc -l` - 5)) $filename > $filename.tmp && mv $filename.tmp $filename
Run Code Online (Sandbox Code Playgroud)


小智 6

保留文件的最后 1000 行(例如:alert_PROD.log)

tail -1000 alert_PROD.log > alert_tmp ; cat alert_tmp > alert_PROD.log ; rm alert_tmp
Run Code Online (Sandbox Code Playgroud)

要保留前 1000 行,请使用 head 命令而不是 tail 命令:

head -1000 alert_PROD.log > alert_tmp ; cat alert_tmp > alert_PROD.log ; rm alert_tmp
Run Code Online (Sandbox Code Playgroud)


Eta*_*ner 5

从头部手册页:

-n, --lines=[-]N
      print  the first N lines instead of the first 10; with the lead-
      ing ‘-’, print all but the last N lines of each file
Run Code Online (Sandbox Code Playgroud)

这意味着... | head -n -2会做你想做的事。

作为替代方案,以下也有效,但我认为它的效率对于大文件一点也不好。

tac file | awk 'NR>2' | tac
Run Code Online (Sandbox Code Playgroud)