我想从文件末尾删除一些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 < file)-22)),\$d" file

从内到外删除最后3行:

$(wc -l < file)

给出文件的行数:比如说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 <<< $'-2,$d

wq'

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

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

它不知道行,但tail + wc可以将行转换为字节:

file=bigone.log

lines=3

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

如果文件同时写入,则存在明显的竞争条件。

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

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

如果您失败登录尝试将密码替换为用户名,则方便一行:

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

这可能适合你(GNU sed):

sed ':a;$!N;1,4ba;P;$d;D' file

尼斯。你错过了结尾的撇号(')。

@Thor哎呀!感谢您指出了这一点。

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

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

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

上面的大多数答案似乎都需要GNU命令/扩展:

$ head -n -2 myfile.txt

-2: Badly formed number

对于更轻松的解决方案:

perl -ne 'push(@fifo,$_);print shift(@fifo) if @fifo > 10;'

要么

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

要么

awk '{buf[NR-1]=$0;}END{ for ( i=0; i < (NR-10); i++){ print buf[i];} }'

其中"10"是"n"。

它可以分3个步骤完成:

a)计算要编辑的文件中的行数:

n=`cat myfile |wc -l`

b)从该数字中减去要删除的行数:

x=$((n-3))

c)告诉sed从该行号($x)删除到结尾:

sed"$x,\$d" myfile

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

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

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

sed -e '$!{N;N;N;N;N;N;H;}' -e x

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

在这里不起作用

请尝试以下命令:

n = line number

tail -r file_name | sed '1,nd' | tail -r

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

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

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

head -n

我更喜欢这个解决方案

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

其中N是要删除的行数。

sed -n ':pre

1,4 {N;b pre

}

:cycle

$!{P;N;D;b cycle

}' YourFile

posix版本

要删除文件的最后N行,可以使用相同的概念

$sed '2,4d' file

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

$tail -r file | sed '1,5d' file | tail -r > file

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

我想出了这个,其中n是你想要删除的行数:

count=`wc -l file`

lines=`expr"$count" - n`

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

mv temp.txt file

rm -f temp.txt

这是一个小迂回,但我认为很容易遵循。

计算主文件中的行数

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

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

用temp文件替换主文件

删除临时文件

这将删除file中的最后3行:

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

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

这将删除最后12行

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

要删除最后4行:

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

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

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

@NeronLeVelu你是对的但是没有tac命令是某些系统(例如FreeBSD?)

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

  1. linux命令赋子包777权限,linux对文件赋权限的命令chmod的详细说明

    指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案 ...

  2. linux 阻止 复位命令,linux防误删操作(使用safe-rm;使用mv命令删除文件)

    本文于2021年1月16日由AlvinCR更新 1.基于文本的Linux为什么没有回收站? 个人观点: 1.linux是指令行操作系统,不同于win的图形化界面,linux无法方便的快速恢复文件,例如 ...

  3. 服务器日志文件已被清除恢复,Linux服务器入侵后日志文件删除/恢复方法

    当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹.管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志.有时可以通过lsof来恢复这些 ...

  4. linux终端删除文件命令_如何在Linux终端中删除文件和目录

    linux终端删除文件命令 Fatmawati Achmad Zaenuri/Shutterstock.comFatmawati Achmad Zaenuri / Shutterstock.com T ...

  5. linux删除vim编辑器创的目录,Linux目录和文件——文本编辑器Vim

    Linux目录和文件--文本编辑器Vim 摘要:本文主要学习在Linux系统中使用Vim文本编辑器编辑文本. 什么是Vim Vim是一个基于文本界面的编辑工具,使用简单且功能强大.更重要的是,Vim是 ...

  6. 【linux】使用sed删除大文件中的指定行

    [linux]使用sed删除大文件中的指定行 引言: 最近在清洗数据时遇到一个超大的文件,需要删除其中不符合数据要求的指定行.使用之前写好的python脚本清洗速度太慢,于是检索了许多linux文件处 ...

  7. linux删除文件最后一行换行符,linux - 使用sed删除最后一个换行符 - 堆栈内存溢出...

    1)从文件中删除最后一个空行: 首先,您当前使用的命令将删除所有空行和空行! 不只是最后一个. 如果要删除最后一行为空/空白的行,则可以使用以下命令: sed '${/^[[:blank:]]*$/d ...

  8. linux删除文件夹下所有文件_手机文件夹全是英文不敢删?删除这6个文件夹,瞬间多出几个G...

    手机使用时间久了,总会面临内存不够的情况,一般情况下我们都会使用手机里自带的手机管家进行清理,但是每次的效果都很一般,可是我们想要对单独的文件夹进行清理时,又会发现文件夹全是英文的,不敢随意乱删,那么 ...

  9. linux sed删除文件最后一行及shell中单引号、双引号的区别

    zxl@fedora DMCCA]$ echo hello >hello [zxl@fedora DMCCA]$ [zxl@fedora DMCCA]$ [zxl@fedora DMCCA]$ ...

  10. 文件节点的linux指令,Java工程师必学的Linux命令(一)文件与目录管理

    从本篇文章开始,我将总结一些Java工程师日常研发工作中会使用到的Linux命令,在介绍这些命令的过程中,也会对Linux系统的一些基础知识进行普及.希望对大家工作和学习有所帮助吧. 本篇将从文件与目 ...

最新文章

  1. C语言之获取类型存储空间
  2. 在JSP页面中使用Ajax主题时的引入
  3. 常见通信协议HTTP、TCP、UDP的简单介绍
  4. python nlp_使用python在stanford-nlp中的回指解析
  5. Node.js「四」—— 路由 / EJS 模板引擎 / GET 和 POST
  6. vivox50pro鸿蒙系统,小米10至尊纪念版和vivox50pro+哪一款手机好
  7. Partition分析
  8. RS232和RS485
  9. Spring数据库事务典型错误用法剖析
  10. python实现切割url得到域名、协议、主机名等各个字段
  11. 【matlab】图像二值化---最大类间方差法
  12. openg 通用扫描画线算法
  13. html怎么做出相框的效果,使用CSS3制作PS级的图片边框效果
  14. free掉结点一定会造成断链吗?
  15. vuepress博客主题—vuepress-theme-reco
  16. Pandas进阶伍 变形
  17. Activiti 从入门到精通
  18. Win10如何使用win7的照片查看器
  19. python的argc与argv
  20. (一)权限管理系统介绍

热门文章

  1. 《都挺好》苏大强,锦鲤杨超越,表情包为何会刷屏?
  2. Ubuntu12.10 使用DNW传数据 进行ARM开发板烧写
  3. 应用于高速计数器的编码器基础知识介绍
  4. 斗鱼实时计算平台的演进
  5. 技术分享 | DNS解析不生效的原因及解决方法
  6. pyqt获得鼠标_PyQt5编程:鼠标事件
  7. 新个人所得税计算公式
  8. 创建计算机桌面快捷方式图标异常,桌面图标显示异常怎么解决
  9. 串口控制计算机重启,电脑开机无限重启解决方法
  10. 计算机应届生必看--Java基础笔试面试题(一)