Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

Is there a simple way I can echo a file, skipping the first and last lines? I was looking at piping from head into tail, but for those it seems like I would have to know the total lines from the outset. I was also looking at split, but I don't see a way to do it with that either.

share|improve this question

5 Answers 5

up vote 53 down vote accepted

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
share|improve this answer

In python i would do like this.

#!/usr/bin/python3
import re
import sys
file = sys.argv[1]
with open(file, 'r') as f:
    L = []
    for line in f:
        line = re.sub(r'\n', r'', line)
        L.append(line)
    print('\n'.join(L[1:-1]))

Paste the above code into a file and name it as script.py. Run the script against the file you want to check with.

python3 script.py /path/to/the/file

Example:

$ cat file
foo
apple
banana
bar
$ python3 script.py file
apple
banana
share|improve this answer

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.

share|improve this answer
tail -n +2 file.txt | head -n -2 

no start no end just clear road

share|improve this answer

Try this:

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
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.