Reading some lines from a file in terminal

At work, I am often asked to find commands that meet specific needs. One of them recurs: how to make selections of lines in a file?

The question is very simple, some of you have got the answer. But when you’re not a “frequent terminal user” you can realize that it’s not as simple.

There are 4 commands to use:

  • head: get firsts lines of a file
  • tail: get last lines of a file
  • cat: get the whole content of a file
  • sed: to manipulate specific lines

“head” and “tail” commands have got an option to get a specific number of lines: “-n”

Let’s create a file to test:

my line 1 for foo
bar line 2
baz line 3
and another line 4
one more for 5
and the last 6

Save the content in “/tmp/example.txt”.

Ok now let’s test:

$ cat /tmp/example.txt
my line 1 for foo
bar line 2
baz line 3
and another line 4
one more for 5
and the last 6

$ head -n2 /tmp/example.txt
my line 1 for foo
bar line 2

$ tail -n3 /tmp/example.txt
and another line 4
one more for 5
and the last 6

Ok, but how to get line 4 of a file ? You can do it with head and tail… But the problem is that you will run 2 commands + an output redirection:

$ head -n 4 /tmp/example.txt | tail -n1
and another line 4

So, the “good” answer can be “use sed”, it will open file only one time:

$ sed -n "4p" /tmp/example.txt
and another line 4

How to read the command ?

  • sed -n => “-n” means “do not print anything”
  • “4p” => when line is number 4, “print” (command “p”)

“sed” can return a lineset, for example from line 3 to 5:

$ sed -n "3,5p" /tmp/example.txt
baz line 3
and another line 4
one more for 5

“head tail” (bad answer) equivalent, that runs 2 commands:

head -n 5 /tmp/example.txt | tail -n 2

You can get several lines, for example the line 2 and 4:

$ sed -n "2p; 4p" /tmp/example.txt
bar line 2
and another line 4

And for this example, there is no “head tail” equivalence that is easilly usable ;)

comments powered by Disqus