Shell script reverse lines of a file

last updated in Categories , , , , , , ,

Q. How do I reverse lines of a file under Linux / UNIX bash shell?

A. You need to use the rev utility or command. It copies the specified files to the standard output, reversing the order of characters in every line. If no files are specified, the standard input is read.

Display one line

tail -1 /etc/passwd
Output:

dnsmasq:x:111:65534:dnsmasq,,,:/var/lib/misc:/bin/false

Reverse one line

$ tail -1 /etc/passwd | rev
Output:

eslaf/nib/:csim/bil/rav/:,,,qsamsnd:43556:111:x:qsamsnd

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

Share this on (or read 18 comments/add one below):

18 comment

  1. and with tac (catin reverse) you can process a file from the end (reverse lines order)

    i did A LOT of googling to find this out (a)

  2. rev actually reverses characters, *not* lines. If you really want to reverse the *lines* of a file, you can use this:
    cat -n myfile | sort -nr | cut -c 9-

  3. tail -r myfile

    -r Reverse. Copies lines from the specified starting point in the file in reverse order. The default for ‘r’ is to print the entire file in reverse order.

      1. Seems Erik got to the source of it: it’s not supported in debian. I’m running Ubuntu; it’s not supported in here either.

        tac is the best answer though: does exactly what we all want and is the simplest

  4. alas, in Linux Debian…

    root@MyServer:/root# tail -r /etc/passwd
    tail: invalid option — r
    Try `tail –help’ for more information.

    On AIX, I did find a version of tail that supports the -r option. Unfortunately, tail -r limits the output to only the last 20480 bytes of a file. If a file is larger, the output of tail is truncated. According to the man page of tail (man tail): “If the file is larger than 20,480 bytes, the -r flag displays only the last 20,480 bytes.”

  5. Works better:

    cat -n temp| sort -nr|awk '{$1="";print}'

    Tested on HPUX. tac and cat -r are not options on UNIX, probably they are part of GNU variants. The perl one-liner didn't work, but it should be easy to make one...

  6. I used rev in:
    find directory -type f | rev | sort | rev | xargs tar -Af archive.tar
    it gave me 122MB after gzipping instead of 128MB produced by
    tar -czf archive.tgz directory
    Poor man’s solid compression :).

  7. [aranas@bb-sas ~/perl]$ awk ‘BEGIN{FS=OFS=”.”}{print $7.$6$5,$4,$3,$2,$1}’ /etc/passwd | tail -1
    ….tacacs:*:4949:0:tacacs:/:/usr/sbin/nologin

    If you run this command it will reverse the columns.

    Have a question? Post it on our forum!