Bash:除了最后n行输入,删除所有行

10

我想要用一个简短的一行代码来删除除最后n行或前n行之外的所有行。

示例:

---

aaaa

bbbb

cccc

dddd

cat/echo/find ...  | sed < all except last 2 lines > 

应该得到的结果

aaaa

bbbb

---

aaaa

bbbb

cccc

dddd

eeee

ffff

cat/echo/find ...  | sed < all except last 2 lines > 

应该得到的结果

aaaa

bbbb

cccc

dddd

---

我需要这个功能在非常大的n值下也能使用。所以可能需要将n设置为100或其他数值。

8个回答

7

如果要删除最后两行,可以使用以下方法:

head -n $(($(wc -l < "$filename") - 2)) "$filename"

这并不是非常优雅,但它应该可以工作。我使用 wc -l 来计算行数,然后使用 head 只显示前面的行数减去 2 行。

编辑:如果要仅保留最后 N 行,可以执行以下操作

tail -n $N $filename

为了只保留前 N 行,您可以执行以下操作。
head -n $N $filename

看起来我可能误解了你的问题,这就是为什么我添加了这两个命令。


2
wc -l < $filename 将消除对 cut 的需求。 - Sean Bright
2
我建议您将反引号更改为括号,像这样:head -n $(($(wc -l < $filename) - 2)) $filename - Jotne
1
非常适合OSX用户,因为不支持“-n -2”语法。一个建议:为了安全起见,双引号引用所有的“$filename”实例。 - mklement0

6

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

tail -1000 alert_PROD.log > alert_tmp ; cat alert_tmp > alert_PROD.log ; rm alert_tmp

为了保留前1000行,请使用head命令而不是tail命令:
head -1000 alert_PROD.log > alert_tmp ; cat alert_tmp > alert_PROD.log ; rm alert_tmp

6

来自 head 命令的 man 页面:

-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

这意味着... | head -n -2将会实现您的需求。作为替代方案,以下方法也可以使用,不过对于大文件来说,其效率可能并不高。
tac file | awk 'NR>2' | tac

事实上,这是最简单的解决方案。对于OSX用户,请注意:它在那里不起作用,请使用@Ivaylo Strandjev的答案。 - mklement0

5
我想保留除了最后n行以外的所有行。 最简单的方法是执行以下操作(让n=5):
tail -n5 $filename > $filename.tmp && mv $filename.tmp $filename

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

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

head -n$((`cat $filename | wc -l` - 5)) $filename > $filename.tmp && mv $filename.tmp $filename

0

删除输入文件的最后3行:

set 3 inputfile; sed "$(($(sed -n $= $2)-$1+1)),\$d" $2

0

打印文件除了前三行和最后三行的所有内容:

$ cat -n file
     1  a
     2  b
     3  c
     4  d
     5  e
     6  f
     7  g
$ awk -v sz="$(wc -l < file)" 'NR>3' file      
d
e
f
g
$ awk -v sz="$(wc -l < file)" 'NR<=(sz-3)' file
a
b
c
d

-1

你也可以尝试一下

awk -vn=2 -f rem.awk input.txt

rem.awk在哪里

BEGIN { ("wc -l " ARGV[1]) | getline 
    a=$1-n+1 }     
NR<a { print }

-1
你可以使用 head 和 tail :
删除除了前 n 行以外的所有行:
``` head -n filename > new_filename ```
删除除了后 n 行以外的所有行:
``` tail -n filename > new_filename ```
这是一个例子:
``` $ cat test ```

1

2

3

4

5

6

7

8

$ head -2 test

1

2


你应该为head和tail的-n选项提供一个值。 - Ivaylo Strandjev
这两个答案都没有回答问题。 - Sean Bright
Sigma,你还没有解决如何删除最后n行的问题。你只说了如何显示它们。 - Ivaylo Strandjev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接