Строки выходного файла от последней к первой в Bash

Я хочу отобразить последние 10 строк моего файла журнала, начиная с последней строки - как обычный читатель журнала. Я думал, что это будет вариация хвостовой команды, но нигде не могу найти ее.


person Yarin    schedule 05.11.2011    source источник
comment
вы имеете в виду, начиная с последней строки, затем последней строки -1, последней строки -2 и т. д.?   -  person Book Of Zeus    schedule 05.11.2011


Ответы (5)


GNU (Linux) использует следующее:

tail -n 10 <logfile> | tac

tail -n 10 <logfile> распечатывает последние 10 строк файла журнала, а tac (cat написано наоборот) меняет порядок.

BSD (OS X) из tail использует параметр -r:

tail -r -n 10 <logfile>

В обоих случаях вы можете попробовать следующее:

if hash tac 2>/dev/null; then tail -n 10 <logfile> | tac; else tail -n 10 -r <logfile>; fi

ПРИМЕЧАНИЕ. В руководстве GNU говорится, что опция BSD -r «может обращать только файлы, размер которых не превышает размера его буфера, который обычно составляет 32 КиБ», и что tac более надежен. Если размер буфера является проблемой и вы не можете использовать tac, вы можете рассмотреть возможность использования ответа @ata, который записывает функциональные возможности в баш.

person Rick Smith    schedule 05.11.2011
comment
Я уверен, что это правильно, но похоже, что команды 'tac' не существует в оболочке OSX ... - person Yarin; 05.11.2011
comment
@Yarin См. stackoverflow.com/questions/742466/ для некоторых альтернатив tac, не все из которых переносимы. - person ephemient; 05.11.2011
comment
Извините, я должен сообщить вам о бесполезном использовании кошки smallo.ruhr.de/award.html, поскольку в tail есть опция -r для изменения порядка. Так что tail -r -n 10 <logfile> - лучший выбор. В качестве бонуса tail -r работает в системах, отличных от GNU, таких как OSX, Solaris, AIX и т. Д. - person Bruno Bronosky; 03.12.2014
comment
@RichardBronosky Хорошая ссылка, я отредактировал свой ответ, добавив в него параметр -r. - person Rick Smith; 04.12.2014
comment
@RickSmith респектабельное смирение, друг. Я получил награду в 1999 году и с тех пор проявляю прилежность. Кроме того, с 1995 по 1999 год я работал только с GNU, прежде чем погрузился в системы Posix, и мне пришлось много переучиваться, потому что администраторы отказались установить весь сахар, к которому я привык. - person Bruno Bronosky; 04.12.2014
comment
GNU tail не имеет опции -r, см. gnu.org/software/coreutils/manual/html_node/ - person m13r; 05.08.2016

tac делает то, что вы хотите. Это противоположно cat.

tail -10 logfile | tac

person drysdam    schedule 05.11.2011

В итоге я использовал tail -r, который работал на моем OSX (tac нет)

tail -r -n10
person Yarin    schedule 06.11.2011
comment
Это лучший ответ, потому что он не специфичен для GNU и позволяет избежать бесполезного использования cat. smallo.ruhr.de/award.html - person Bruno Bronosky; 03.12.2014
comment
Не работает root@elk:/# tail -r -n1 /var/log/logstash-test-output.log tail: invalid option -- 'r' - person basickarl; 26.02.2016
comment
@KarlMorrison Это не будет работать для хвостовых команд, отличных от BSD. Дополнительную помощь см. В моем ответе ... - person Rick Smith; 16.08.2016

Вы можете сделать это с помощью чистого bash:

#!/bin/bash
readarray file
lines=$(( ${#file[@]} - 1 ))
for (( line=$lines, i=${1:-$lines}; (( line >= 0 && i > 0 )); line--, i-- )); do
    echo -ne "${file[$line]}"
done

./tailtac 10 ‹некоторый файл

./tailtac -10 ‹некоторый файл

./tailtac 100000 ‹некоторый файл

./tailtac ‹некоторый файл

person ata    schedule 05.11.2011

Это идеальный способ распечатать результат в обратном порядке.

tail -n 10 <logfile>  | tac
person Ashish Kumar Laxkar    schedule 02.07.2014
comment
Для чего нужны звездочки? - person Yarin; 03.07.2014
comment
Использование слова «идеальный» вызывает критику. - person Bruno Bronosky; 04.12.2014