How to use sed to remove the last n lines of a file
我想从文件末尾删除一些n行。 这可以用sed完成吗?
例如,要删除2到4行,我可以使用
1 | $ sed '2,4d' file |
但我不知道行号。 我可以删除最后一行使用
1 | $sed $d file |
但我想知道从最后删除n行的方法。 请告诉我如何使用sed或其他方法来做到这一点。
我不知道
1 | head -n -2 myfile.txt |
如果硬编码n是一个选项,您可以使用顺序调用sed。例如,要删除最后三行,删除最后一行三次:
1 | sed '$d' file | sed '$d' | sed '$d' |
来自sed one-liners:
1 2 3 | # 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 |
似乎是你在寻找的东西。
一个有趣的&简单的
1 2 | n=4 tac file.txt | sed"1,$n{d}" | tac |
注意
-
shell需要双引号
" 来评估sed 命令中的$n 变量。在单引号中,不会执行插值。 -
tac 是cat 反转,见man 1 tac -
sed 中的{} 用于分隔$n &d (如果没有,shell尝试插入不存在的$nd 变量)
使用
1 | sed -i"$(($(wc -l < file)-22)),\$d" file |
从内到外删除最后3行:
1 | $(wc -l < file) |
给出文件的行数:比如说2196
我们想删除最后23行,所以对于左侧或范围:
1 | $((2196-22)) |
给:2174
因此,shell解释后的原始sed是:
1 | sed -i '2174,$d' file |
使用
如果要将其保存到新文件中,代码为:
1 | sed -i '2174,$d' file > outputfile |
你可以用头来做这个。
使用
其中N是您要从文件中删除的行数。
原始文件的内容减去最后N行现在在new_file中
为了完整起见,我想补充一下我的解决方案。
我最终使用标准
1 2 | ed -s sometextfile <<< $'-2,$d wq' |
这将使用就地编辑删除最后两行(尽管它确实使用
要真正就地截断非常大的文件,我们有
它不知道行,但
1 2 3 | file=bigone.log lines=3 truncate -s -$(tail -$lines $file | wc -c) $file |
如果文件同时写入,则存在明显的竞争条件。
在这种情况下,最好使用
1 | truncate -s $(head -n -$lines $file | wc -c) $file |
如果您失败登录尝试将密码替换为用户名,则方便一行:
1 | truncate -s $(head -n -5 /var/log/secure | wc -c) /var/log/secure |
这可能适合你(GNU sed):
1 | sed ':a;$!N;1,4ba;P;$d;D' file |
上面的大多数答案似乎都需要GNU命令/扩展:
1 2 | $ head -n -2 myfile.txt -2: Badly formed number |
对于更轻松的解决方案:
1 | perl -ne 'push(@fifo,$_);print shift(@fifo) if @fifo > 10;' |
要么
1 | perl -ne 'push(@buf,$_);END{print @buf[0 ... $#buf-10]}' |
要么
1 | awk '{buf[NR-1]=$0;}END{ for ( i=0; i < (NR-10); i++){ print buf[i];} }' |
其中"10"是"n"。
它可以分3个步骤完成:
a)计算要编辑的文件中的行数:
1 | n=`cat myfile |wc -l` |
b)从该数字中减去要删除的行数:
1 | x=$((n-3)) |
c)告诉sed从该行号(
1 | sed"$x,\$d" myfile |
通过这里的答案,您已经了解到sed不是此应用程序的最佳工具。
但是我确实认为使用sed有一种方法可以做到这一点;我的想法是附加N行来保持空间,直到你能够阅读而不会击中EOF。点击EOF时,打印保留空间的内容并退出。
1 | sed -e '$!{N;N;N;N;N;N;H;}' -e x |
上面的sed命令将省略最后5行。
请尝试以下命令:
1 2 | n = line number tail -r file_name | sed '1,nd' | tail -r |
您可以使用
我更喜欢这个解决方案
1 | head -$(gcalctool -s $(cat file | wc -l)-N) file |
其中N是要删除的行数。
1 2 3 4 5 6 | sed -n ':pre 1,4 {N;b pre } :cycle $!{P;N;D;b cycle }' YourFile |
posix版本
要删除文件的最后N行,可以使用相同的概念
1 | $ sed '2,4d' file |
您可以使用带有tail命令的组合来反转文件:如果N是5
1 | $ tail -r file | sed '1,5d' file | tail -r > file |
这种方式也运行
我想出了这个,其中n是你想要删除的行数:
1 2 3 4 5 | count=`wc -l file` lines=`expr"$count" - n` head -n"$lines" file > temp.txt mv temp.txt file rm -f temp.txt |
这是一个小迂回,但我认为很容易遵循。
这将删除
这将删除最后12行
1 | sed -n -e :a -e '1,10!{P;N;D;};N;ba' |
要删除最后4行:
1 | $ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//' |