热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux删除文件子最后两行,关于linux:如何使用sed删除文件的最后n行

我想从文件末尾删除一些n行。这可以用sed完成吗?例如,要删除2到4行,我可以使用$sed2,4dfile但我不知道行号。我可以删除最后一

我想从文件末尾删除一些n行。 这可以用sed完成吗?

例如,要删除2到4行,我可以使用

$sed '2,4d' file

但我不知道行号。 我可以删除最后一行使用

$sed $d file

但我想知道从最后删除n行的方法。 请告诉我如何使用sed或其他方法来做到这一点。

$ sed'2,$ d'文件

@arashkordi:它使用文件顶部的行数,而不是底部。

@ams:哎呀! 我应该更加小心

关于超级用户的相关问题。

//,或许可以考虑重新解释这个问题,使其更加通用而不仅仅是sed?

sed $d file返回错误。 相反,$ d应该在引号内,如下所示:sed '$d' file

我不知道sed,但可以用head完成:

head -n -2 myfile.txt

+1表示简单。等效的sed命令很难看:sed -e :a -e '$d;N;2,5ba' -e 'P;D' file(最后5行的,5)。

请注意,这适用于某些版本的head,但不是标准版本。实际上,head的标准是:The application shall ensure that the number option-argument is a positive decimal integer.

答案很吸引人。

@rjdkolb感谢你的编辑,但负数传统上确实有一个破折号。

如果要更新输入文件,则必须将其输入tee

这听起来不安全;你确定那里没有竞争条件吗?我想它会因shell而异。

添加到@WilliamPursell的答案...在Mac OS默认shell上,这不起作用。

也不是BSD,但问题是标记为Linux。

@ams不会只打印到标准输出?测试了Ubuntu 14.0.4

@codecowboy,是的,就像问题中的sed命令一样。您可以将其传输到新文件。这里没有"就地修改"选项。 (不要试图把它管回自己!)

减去1,因为除了osx之外,这对我来说不适用于Ubuntu14 - head: illegal line count -- -2

@MichaelDurrant对我来说在14.04.2上工作正常。你是否从其他GNU coreutils安装了head?试试head --version。

对于Mac和BSD人来说,这是我如何解决它:some_command | tail -r | sed -e '1,3d' | tail -r。注意tail -r反转缓冲区sed命令删除前3行,tail -r再次反转缓冲区以将其恢复为原始顺序。

现在是2019年,我感到鼓舞的是,使用Docker以最难以克服的方式在OSX上使用GNU头:docker run -v /Users/me/reports:/reports ubuntu head -n -7 /reports/ugly_footer.csv

如果硬编码n是一个选项,您可以使用顺序调用sed。例如,要删除最后三行,删除最后一行三次:

sed '$d' file | sed '$d' | sed '$d'

加上-i来编辑文件而不是将其转储到stdout,对我有用。

来自sed one-liners:

# delete the last 10 lines of a file

sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # method 1

sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # method 2

似乎是你在寻找的东西。

@Thor您可以通过更改'$d;N;2,10ba'中的10来更改从文件中删除的行数

@AlexejMagura:我正在评论早期版本的答案。

这个答案是唯一一个技术上正确的答案。最好的正确。

一个有趣的&简单的sed和tac解决方案:

n=4

tac file.txt | sed"1,$n{d}" | tac

注意

shell需要双引号"来评估sed命令中的$n变量。在单引号中,不会执行插值。

tac是cat反转,见man 1 tac

sed中的{}用于分隔$n& d(如果没有,shell尝试插入不存在的$nd变量)

osx上的fyi no tac

@MichaelDurrant port info coreutils || brew info coreutils;

使用sed,但让shell进行数学计算,目标是通过给出一个范围(删除最后23行)来使用d命令:

sed -i"$(($(wc -l

从内到外删除最后3行:

$(wc -l

给出文件的行数:比如说2196

我们想删除最后23行,所以对于左侧或范围:

$((2196-22))

给:2174

因此,shell解释后的原始sed是:

sed -i '2174,$d' file

使用-i进行就地编辑,文件现在是2173行!

如果要将其保存到新文件中,代码为:

sed -i '2174,$d' file > outputfile

你可以用头来做这个。

使用

$ head --lines=-N file > new_file

其中N是您要从文件中删除的行数。

原始文件的内容减去最后N行现在在new_file中

--lines不适用于osx

为了完整起见,我想补充一下我的解决方案。

我最终使用标准ed执行此操作:

ed -s sometextfile <<<$&#39;-2,$d

wq&#39;

这将使用就地编辑删除最后两行(尽管它确实使用/tmp中的临时文件!!)

要真正就地截断非常大的文件&#xff0c;我们有truncate命令。

它不知道行&#xff0c;但tail &#43; wc可以将行转换为字节&#xff1a;

file&#61;bigone.log

lines&#61;3

truncate -s -$(tail -$lines $file | wc -c) $file

如果文件同时写入&#xff0c;则存在明显的竞争条件。

在这种情况下&#xff0c;最好使用head - 它从文件开头(思维磁盘IO)计算字节数&#xff0c;因此我们将始终截断行边界(如果文件被主动写入&#xff0c;可能会比预期更多行)&#xff1a;

truncate -s $(head -n -$lines $file | wc -c) $file

如果您失败登录尝试将密码替换为用户名&#xff0c;则方便一行&#xff1a;

truncate -s $(head -n -5 /var/log/secure | wc -c) /var/log/secure

这可能适合你(GNU sed)&#xff1a;

sed &#39;:a;$!N;1,4ba;P;$d;D&#39; file

尼斯。你错过了结尾的撇号(&#39;)。

&#64;Thor哎呀&#xff01;感谢您指出了这一点。

对于这么晚的评论感到抱歉&#xff0c;但我尝试(并为我的AIX / posix加上)它打印除了最后一行之外都失败了。读取代码&#xff0c;我不明白最后四行是如何被删除的&#xff0c;显式循环是在第一行的4行&#xff0c;因此它肯定在GNU sed的d&#xff0c;d或P之后循环&#xff0c;而不是在posix版本上。在d之后似乎没有打印行&#xff0c;并且在没有传递到动作行的"结束"的情况下保留在新循环的工作缓冲区中。

&#64;NeronLeVelu程序在一个4行的窗口中读入模式空间&#xff0c;然后附加下一行并打印第一行&#xff0c;直到它到达文件末尾&#xff0c;删除剩余的行。

&#64;potong是的&#xff0c;我在GNU sed上进行测试&#xff0c;它在缓冲区之间保持缓冲区&#xff0c;其中posix在d之后卸载它&#xff0c;产生相反的效果。

上面的大多数答案似乎都需要GNU命令/扩展&#xff1a;

$ head -n -2 myfile.txt

-2: Badly formed number

对于更轻松的解决方案&#xff1a;

perl -ne &#39;push(&#64;fifo,$_);print shift(&#64;fifo) if &#64;fifo > 10;&#39;

要么

perl -ne &#39;push(&#64;buf,$_);END{print &#64;buf[0 ... $#buf-10]}&#39;

要么

awk &#39;{buf[NR-1]&#61;$0;}END{ for ( i&#61;0; i <(NR-10); i&#43;&#43;){ print buf[i];} }&#39;

其中"10"是"n"。

它可以分3个步骤完成&#xff1a;

a)计算要编辑的文件中的行数&#xff1a;

n&#61;&#96;cat myfile |wc -l&#96;

b)从该数字中减去要删除的行数&#xff1a;

x&#61;$((n-3))

c)告诉sed从该行号($x)删除到结尾&#xff1a;

sed"$x,\$d" myfile

数学不好。 如果你必须删除3行&#xff0c;则减去3但是加1。用数学计算&#xff0c;如果文件有10行&#xff0c;10 - 3 &#61; 7而你使用sed删除7到10行&#xff0c;那就是4行&#xff0c;不是3。

通过这里的答案&#xff0c;您已经了解到sed不是此应用程序的最佳工具。

但是我确实认为使用sed有一种方法可以做到这一点;我的想法是附加N行来保持空间&#xff0c;直到你能够阅读而不会击中EOF。点击EOF时&#xff0c;打印保留空间的内容并退出。

sed -e &#39;$!{N;N;N;N;N;N;H;}&#39; -e x

上面的sed命令将省略最后5行。

在这里不起作用

请尝试以下命令&#xff1a;

n &#61; line number

tail -r file_name | sed &#39;1,nd&#39; | tail -r

请解释这是如何工作的。仅供参考 - 要初始化shell变量&#xff0c;我们不应该在&#61;周围有空格。

&#64;codeforester第一行是我猜的评论。他只使用tail -r&#xff0c;其他人使用tac来反转行顺序&#xff0c;并使最后的n行成为n的第一行。

您可以使用wc -l获取行的总计数

head -n

我更喜欢这个解决方案

head -$(gcalctool -s $(cat file | wc -l)-N) file

其中N是要删除的行数。

sed -n &#39;:pre

1,4 {N;b pre

}

:cycle

$!{P;N;D;b cycle

}&#39; YourFile

posix版本

要删除文件的最后N行&#xff0c;可以使用相同的概念

$sed &#39;2,4d&#39; file

您可以使用带有tail命令的组合来反转文件&#xff1a;如果N是5

$tail -r file | sed &#39;1,5d&#39; file | tail -r > file

这种方式也运行head -n -5 file命令不运行(就像在Mac上&#xff01;)。

我想出了这个&#xff0c;其中n是你想要删除的行数&#xff1a;

count&#61;&#96;wc -l file&#96;

lines&#61;&#96;expr"$count" - n&#96;

head -n"$lines" file > temp.txt

mv temp.txt file

rm -f temp.txt

这是一个小迂回&#xff0c;但我认为很容易遵循。

计算主文件中的行数

减去要从计数中删除的行数

打印出要保留的行数并存储在临时文件中

用temp文件替换主文件

删除临时文件

这将删除file中的最后3行&#xff1a;

for i in $(seq 1 3); do sed -i &#39;$d&#39; file; done;

这对于大文件来说太昂贵了 - 整个文件必须被读取和重写n次&#xff01;和sed一样多的叉子。

这将删除最后12行

sed -n -e :a -e &#39;1,10!{P;N;D;};N;ba&#39;

要删除最后4行&#xff1a;

$nl -b a file | sort -k1,1nr | sed &#39;1, 4 d&#39; | sort -k1,1n | sed &#39;s/^ *[0-9]*\t//&#39;

请解释您的陈述如何运作。

与头部相比&#xff0c;有点沉重(特别是在资源方面)。至少tac file | sed &#39;1,4d&#39; | tac因为排序然后删除前缀成本很多的资源。

&#64;NeronLeVelu你是对的但是没有tac命令是某些系统(例如FreeBSD&#xff1f;)



推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • mongodb复制集部署文档 ... [详细]
  • Linux提权之suid篇
    Linux提权之suid篇不知攻,焉知防一个在安服路上摸索的大三生,记录平时学习笔记suid前言:1.只有可以执行的二进制程序文件才 ... [详细]
  • Spring Boot 打包上传Docker 仓库的详细步骤
    这篇文章主要介绍了SpringBoot打包上传Docker仓库的详细步骤,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 ... [详细]
  • NSSROUND#8[Basic]
    文章目录一、[NSSRound#8Basic]MyDoor二、[NSSRound#8Basic]Upload_gogoggo三、[NSSRound#8Basic]MyPage四、[ ... [详细]
  • 一、如果使用默认的1521端口,让实例自动注册到该监听上,那么local_listener无需设置,listener.ora文件按照正常方 ... [详细]
  • Docker从安装到入门到项目部署
    容器化的时代你怎么可 ... [详细]
  • 重装WIN7之后使用UbuntuLiveCD修复grub2双系统引导拿起ubuntu启动光盘启动进入试用ubuntu,打开终端输入命令sudofdisk-l#查看我u ... [详细]
  • helm V3版本
    1、引入(1)之前方式部署应用基本过程*编写yaml文件**deployment**Service**Ingress(负载均衡、 ... [详细]
  • Docker基础和常用命令详解_docker
    这篇文章主要介绍了Docker基础和常用命令方法的相关资料, ... [详细]
  • linux系统关掉网卡命令_如何关闭Linux系统?
    linux系统关掉网卡命令IamnewtoLinuxandIhaveinstalledsomeLinuxdistributions.Itrytolearnbashcommands. ... [详细]
  • Ubuntu16.0464位安装armlinuxgcc交叉编译器以及samba服务器
    交叉编译器是嵌入式开发的必要工具,但是由于目前大多数人使用64位ubuntu,在照着很多教程做的时候,就会失败,失败原因是64位ubuntu需要额外安装32位的兼容包。以arm-l ... [详细]
  • Matlab中利用mex编译Opencv实现画板绘图功能
    图形绘制是标记和可视化数据的重要方法.通过在Matlab中集成画板绘图功能,可为科学计算提供便利.1设置Matlab支持Opencv编译操作系统:麒麟14.04(基于Ubu ... [详细]
  • jenkins中 Slave使用Docker
    原因就不说了,网上的自动化测试Docker教程太不靠谱,还是学学官网吧。目的:在现在各种虚拟化的大条件下,还在建立N个节点机 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
author-avatar
zr8744814
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有