Ao contrário de sed -i
, tail
é inteligente o suficiente para não ler um arquivo desde o início para determinar qual é sua última linha; também, o linux tem um utilitário truncate(1)
, que combinado com tail
permite que você "insira" a (s) última (s) linha (s) de um arquivo grande no tempo O (1):
# usage popline file [line_count, 1 by default]
popline(){ LC_CTYPE=C l='tail -"${2:-1}" "$1"; echo t'; l=${l%t}; truncate -s "-${#l}" "$1"; printf %s "$l"; }
$ wc -l /tmp/foo
687800 /tmp/foo
$ cp /tmp/foo /tmp/foo1 && time sed -i '$d' /tmp/foo1
real 0m1.185s
user 0m0.196s
sys 0m0.984s
$ cp /tmp/foo /tmp/foo1 && time popline /tmp/foo1
*/
real 0m0.082s
user 0m0.000s
sys 0m0.000s