Answers:
我不知道sed
,但是可以用head
:
head -n -2 myfile.txt
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.
head: illegal line count -- -2
一个有趣而简单的sed
和tac
解决方案:
n=4
tac file.txt | sed "1,$n{d}" | tac
注意
"
shell需要双引号来评估命令中的$n
变量sed
。用单引号将不会执行插值。tac
是cat
颠倒的,看man 1 tac
{}
中sed
是否有分离$n
&d
(如果不是,壳尝试插值不存在的$nd
变量)tac
osx上的fyi no
port info coreutils
|| brew info coreutils
;
使用sed
,但让Shell进行数学运算,目标是d
通过给出一个范围来使用命令(删除最后23行):
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
要真正截断非常大的文件,我们有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
'
)。
d
,D
或者P
用GNU sed的,而不是在POSIX版本。似乎没有D
在行之后打印行,并保留在工作缓冲区中以进行新循环,而不传递到动作行的“结束”行。
D
产生相反效果后将行之间的缓冲区保持在posix卸载的位置。
上面的大多数答案似乎都需要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”。
有了这里的答案,您已经了解到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
=
。
tail -r
其他人用来tac
反转行顺序的位置,并使最后n
一行成为n
第一行。
它可以通过3个步骤完成:
a)计算要编辑的文件中的行数:
n=`cat myfile |wc -l`
b)从该数字中减去要删除的行数:
x=$((n-3))
c)告诉sed从该行号($x
)到结尾删除:
sed "$x,\$d" myfile
sed
删除线7至10,即4线,没有3
这将从以下内容中删除最后3行file
:
for i in $(seq 1 3); do sed -i '$d' file; done;
sed
。
要删除最后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
因为排序然后删除前缀会花费大量资源。
tac
某些系统没有命令(例如FreeBSD?)
要删除文件的最后N行,可以使用相同的概念
$ sed '2,4d' file
您可以使用带tail的组合命令来反转文件:如果N为5
$ tail -r file | sed '1,5d' file | tail -r > file
而且这种方式也可以在head -n -5 file
不运行命令的地方运行(例如在Mac上!)。