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 ;)