133

If I use cat -n text.txt to automatically number the lines, how do I then use the command to show only certain numbered lines.

2
  • 1
    What do you mean with "show only certain numbered lines", can you put an expected output?
    – tachomi
    Jun 8 '16 at 19:27
  • 1
    There's probably going to be a million ways to do this. tail + head can also do this, as can awk
    – Bratchley
    Jun 8 '16 at 19:36
240

Use sed

Usage

$ cat file
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

To print one line (5)

$ sed -n 5p file
Line 5

To print multiple lines (5 & 8)

$ sed -n -e 5p -e 8p file
Line 5
Line 8

To print specific range (5 - 8)

$ sed -n 5,8p file
Line 5
Line 6
Line 7
Line 8

To print range with other specific line (5 - 8 & 10)

$ sed -n -e 5,8p -e 10p file
Line 5
Line 6
Line 7
Line 8
Line 10
45

One way of doing it is by using sed:

cat -n text.txt | sed '11d'

where 11 is the number of the line you want removed.

Or to remove all but 11:

cat -n text.txt | sed '11!d'

Ranges are also possible:

cat -n text.txt | sed '9,12!d'

And cat -n isn't even needed:

sed '9,12!d' text.txt
32

You can use awk straight up.

awk 'NR==1' file.txt

replacing '1' with the desired line number.

2
  • 1
    This is by a million miles the best answer here and deserves a lot more love than it has.
    – Wren
    Nov 4 '18 at 15:56
  • Simple solution for 50ish years. Good post.
    – Cymatical
    Jul 15 at 15:05
14

Depending on goals I like head or grep

cat /var/log/syslog -n | head -n 50 | tail -n 10

will return lines 41 thru 50.

or

cat /var/log/syslog -n | grep " 50" -b10 -a10

will show lines 40 thru 60. The problem with the grep method is that you have to use account for padding of the line numbers (notice the space)

Both are quite handy for parsing log files.

4
  • Neither example needs cat though
    – roaima
    Jun 9 '16 at 9:12
  • 2
    well yeah... but.... but... ..... There are better ways. The question asked about using cat though, so I used it.
    – coteyr
    Jun 9 '16 at 9:22
  • cat can't do what the OP wants
    – roaima
    Jun 9 '16 at 9:33
  • Nice tricks. Tx.
    – Cymatical
    Jul 15 at 15:06
5

As others have shown you, there is no need to use cat -n. Other programs will do it for you. If, however, you really need to parse the output of cat -n and show only specific lines (for example, 4-8, 12 and 42), you could do:

$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42'
 4  Line 4
 5  Line 5
 6  Line 6
 7  Line 7
 8  Line 8
12  Line 12
42  Line 42

In awk, $1 is the first field, so this command prints all lines whose first fields are i) between 4 and 8 (inclusive) or ii) 12 or iii) 42.

If you also want to remove the field added by cat -n to get the original lines from the file, you can do:

$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42{sub(/^\s*[0-9]+\s*/,""); print}'
Line 4
Line 5
Line 6
Line 7
Line 8
Line 12
Line 42
2
  • Couldn't you use NR instead of $1? May 27 '20 at 18:57
  • @SolomonUcko sure, but since I was demonstrating how to do this using cat -n specifically, I thought I would use the output that cat -n provides.
    – terdon
    May 27 '20 at 18:59
2

You can use sed to show only one number and loop this with a for loop:

for line in 1 3 7 11; do sed -n ${line}p text.txt; done

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