Команда tac command создает странный вывод

Скажем, у меня есть этот файл, содержащий ничего, кроме

a b c b a 

Используя tac --separator=a file в BASH [на Linux на базе Debian], я получаю следующее:

  # empty line # empty line b c b aacommand@prompt # two a just before the prompt 

Вопрос : Насколько я понял, --separator=a определяет, что a отмечает разрыв внутри строки, а не newline строку. Это правильно?

Я пробовал это с другими струнами гораздо больше ввода и в конечном итоге с довольно беспорядок. Другие варианты все работают правильно, я полагаю: если я использую tac --before я сначала получу около пяти пустых строк, но тогда это о том, что должно произойти, правильно?

tac легче понять в случае, когда он предназначен, в первую очередь, для этого, когда разделитель является терминатором записи, т. е. после последней записи появляется разделитель. Он печатает записи (включая каждый терминатор) в обратном порядке.

 $ echo -n fooabara | tac -sa; echo rabafooa 

Вход состоит из трех записей ( foo , b и r ), за которыми следует разделитель a ; вывод состоит из трех записей ( r , b и foo ), за которыми следует разделитель a .

Если последняя запись не заканчивается терминатором записи, она все же печатается первой, без разделителя записей.

 $ echo -n fooabar | tac -sa; echo rbafooa 

Последняя запись r заканчивается конкатенацией следующей последней записи b без разделителя между ними, поскольку в конце последней записи не было разделителя.

Ваш ввод выглядит немного более запутанным из-за новых строк. Давайте увидим это вместо запятой вместо запятой:

 $ echo -na,b,c,b,a, | tac -sa; echo ,,b,c,b,aa 

Существует три входных записи: пустая (с терминатором a ), объемная единица ,,b,c,b, (опять же с терминатором) и неисчерпаемая в конце. Эти записи (каждая со своим терминатором, за исключением последней записи, которая не имеет терминатора) печатаются в обратном порядке.

Ваша путаница, вероятно, исходит из ожидания того, что «разделитель» будет разделителем, но это неправильное название: это действительно рекордный терминатор. --before он --before инициатором.

Следующий пример может помочь использовать параметр --regex :

 $ cat records ---1--- 1 2 3 ---2 A B C ---3-- a b c $ tac --before --regex --separator=^---[0-9]+-*$ records ---3-- a b c ---2 A B C ---1--- 1 2 3 

В этом примере records файлов содержат многострочные записи, каждая из которых начинается с строки ( ^...$ ), которая начинается с --- , затем число ( [0-9]+ ) и необязательная последовательность знаков минус ( -* ). Можно увидеть порядок строк в каждой записи, а его строка заголовка сохранена.

Я использую trac таким образом, чтобы показывать записи в файлах журналов в обратном порядке, как это используется в приложениях подачи, таких как твиттер. Например, для печати только двух последних записей в обратном порядке:

 tac --before --regex --separator=^---[0-9]+-*$ example \ | awk '/^---[0-9]+-*$/ {c++} c>2 {exit}{print}'