Print file content without the first and last lines

Just with sed, without any pipes :

sed '1d;$d' file.txt

NOTE

  • 1 mean first line
  • d mean delete
  • ; is the separator for 2 commands
  • $ mean last line

You don't need to know the number of lines in advance. tail and head can take an offset from the beginning or end of the file respectively.

This pipe starts at the second line of the file (skipping the first line) and stops at the last but one (skipping the final line). To skip more than one line at the beginning or end, adjust the numbers accordingly.

tail -n +2 file.txt | head -n -1

doing it the other way round, works the same, of course:

head -n -1 file.txt | tail -n +2

Here is how to do it with awk:

awk 'NR>2 {print t} {t=$0}'

Also another way for sed:

sed '1d;x' file.txt

x is advanced sed command, it switches current line with the previous one: current goes into the buffer and previous goes to the screen and so on while sed processing stream line by line (this is why the first line will be blank).

awk solution on each step (line) puts current line into the variable and starts printing it out only after the second line is passed by. Thus, we got shitfed sequence of lines on the screen from the second to the last but one. Last line is omitted becasue the line is in the variable and should be printed only on the next step, but all steps already run out and we never see the line on the screen.

Same idea in the perl:

perl -ne 'print $t if $.>2 ; $t=$_' file.txt

$. stands for line number and $_ for current line.
perl -n is shortcut for while(<..>) {..} structure and -e is for inline script.