Thanks to Michael Wang for contributing the following shell-only implementation and
reminding us about cat -n
. Note that
our sample file named lines has a trailing blank
line:
$ i=0; while IFS= read -r line; do (( i++ )); echo "$i $line"; done < lines 1 Line 1 2 Line 2 3 4 Line 4 5 Line 5 6
Or a useful use of cat:
$ cat -n lines 1 Line 1 2 Line 2 3 4 Line 4 5 Line 5 6 $ cat -b lines 1 Line 1 2 Line 2 3 Line 4 4 Line 5
If you only need to display the line numbers on the screen, you
can use less -N
:
$ /usr/bin/less -N filename 1 Line 1 2 Line 2 3 4 Line 4 5 Line 5 6 lines (END)
Line numbers are broken in old versions of
less on some obsolete Red Hat systems. Check your
version with less -V
. Version
358+iso254 (e.g., Red Hat 7.3 & 8.0) is known to be bad. Version
378+iso254 (e.g., RHEL3) and version 382 (RHEL4, Debian Sarge) are
known to be good; we did not test other versions. The problem is
subtle and may be related to an older iso256
patch. You can easily compare last line numbers as the
vi and Perl examples are correct.
You can also use vi (or
view, which is read-only vi)
with the :set nu!
command:
$ vi filename 1 Line 1 2 Line 2 3 4 Line 4 5 Line 5 6 ~ :set nu!
vi has many options, so you can start vi by doing
things like vi +3 -c 'set nu!'
filename
to turn on line numbering and place
your cursor on line 3. If you’d like more control over how the numbers
are displayed, you can also use nl, awk, or
perl:
$ nl lines 1 Line 1 2 Line 2 3 Line 4 4 Line 5 $ nl -ba lines 1 Line 1 2 Line 2 3 4 Line 4 5 Line 5 6 $ awk '{ print NR, $0 }' filename 1 Line 1 2 Line 2 3 4 Line 4 5 Line 5 6 $ perl -ne 'print qq($. $_);' filename 1 → Line 1 2 → Line 2 3 → 4 → Line 4 5 → Line 5 6 →
NR
and $. are the line number
in the current input file in awk and Perl
respectively, so it’s easy to use them to print the line number. Note
that we are using a → to denote a Tab character in the Perl output,
while awk uses a space by default.
man cat
man nl
man awk
man less
man vi
3.17.174.204