我想删除除了最后一行或前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任何帮助!
要删除最后两行,您可以使用以下内容:
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)
看来我可能误解了您的问题,这就是我添加这两个命令的原因。
小智 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)
从头部手册页:
-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)