How to obtain inverse behavior for `tail` and `head`?
You can use this to strip the first two lines:
tail -n +3 foo.txt
and this to strip the last two lines:
head -n -2 foo.txt
(assuming the file ends with \n
for the latter)
Just like for the standard usage of tail
and head
these operations are not destructive. Use >out.txt
if you want to redirect the output to some new file:
tail -n +3 foo.txt >out.txt
In the case out.txt
already exists, it will overwrite this file. Use >>out.txt
instead of >out.txt
if you'd rather have the output appended to out.txt
.
If you want all but the first N-1 lines, call tail
with the number of lines +N
. (The number is the number of the first line you want to retain, starting at 1, i.e. +1 means start at the top, +2 means skip one line and so on).
tail -n +3 foo.txt >>other-document
There's no easy, portable way to skip the last N lines. GNU head
allows head -n +N
as a counterpart of tail -n +N
. Otherwise, if you have tac
(e.g. GNU or Busybox), you can combine it with tail:
tac | tail -n +3 | tac
Portably, you can use an awk filter (untested):
awk -vskip=2 '{
lines[NR] = $0;
if (NR > skip) print lines[NR-skip];
delete lines[NR-skip];
}'
If you want to remove the last few lines from a large file, you can determine the byte offset of the piece to truncate then perform the truncation with dd
.
total=$(wc -c < /file/to/truncate)
chop=$(tail -n 42 /file/to/truncate | wc -c)
dd if=/dev/null of=/file/to/truncate seek=1 bs="$((total-chop))"
You can't truncate a file in place at the beginning, though if you need to remove the first few lines of a huge file, you can move the contents around.
From the tail
man page (GNU tail
, that is):
-n, --lines=K
output the last K lines, instead of the last 10; or use -n +K to
output lines starting with the Kth
Thus, the following should append all but the first 2 lines of somefile.txt
to anotherfile.txt
:
tail --lines=+3 somefile.txt >> anotherfile.txt