Как я могу получить команду tac на OS X?

59

Мне нравится использовать, tacчтобы полностью изменить вывод cat. Тем не менее, он не доступен в терминале Mavericks. Я попытался найти его на MacPorts, и снова он недоступен. Может кто-нибудь показать, пожалуйста, как получить tac? Это очень полезно для чтения файлов журнала.

поляризовать
источник

Ответы:

66

Да:

  • Установить Homebrew
  • brew install coreutils
  • ln -s /usr/local/bin/gtac /usr/local/bin/tac очевидно, не требуется с последним Homebrew, см. комментарий Ран Эвер-Хадани ниже

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

grebneke
источник
Я не понимаю, как ln -s /usr/local/bin/gtac /usr/local/bin/tacэто работает ... Разве эта команда не должна перечислять только блоки файловой памяти?
Тимоти Свон
1
Символическая ссылка только для удобства. Homebrew устанавливает двоичные файлы coreutil в / usr / local / bin, добавляя к их исходному имени префикс «g». lsстановится gls, headстановится gheadи так далее. Следовательно, tacустанавливается как gtac, и символическая ссылка, предложенная в этом ответе, просто сделана tacдоступной под этим именем. Пропустив символическую ссылку, вы все равно можете запустить программу как gtac.
Гребнеке
Ой. Вы говорите ln -sне об ls -sэтом. Теперь это имеет больше смысла. Я должен был ввести это правильно с первого раза.
Тимоти Свон
2
Дополнение к ответу Гребнеке : больше не нужна мягкая ссылка. Суффикс g теперь добавляется, только если в osx уже есть команда с таким именем, поэтому tac устанавливается как tac, а не как gtac.
Бег Эвер-Хадани
71

В OS / X , как на многих системах (BSDs, Solaris, AIX, IRIX ...), функциональность GNU tacдоступна в tailс -r опцией . Так что нет необходимости устанавливать GNU tac:

tail -r the-file
Стефан Шазелас
источник
11
Итак, alias tac='tail -r'сделаем свое дело для OP!
MKC
8
Ну, на самом деле использование псевдонима оболочки может дать сбой, потому что псевдонимы не переносятся в сценарии оболочки. Используйте такую ​​функцию, какtac() { tail -r -- "$@"; }
Кодзиро
Есть ли такие опции, -rsкоторые позволят вам повернуть вспять на уровне символов вместо новых строк?
Субин Себастьян
@SubinSebastian, я обновил ссылку на справочную страницу, которую Apple больше не делает доступной. Но в общем, нет BSD tailне имеет эквивалента GNU tac«s -sвариант.
Стефан Шазелас
0

Одним из временных решений может быть:

alias tac='perl -e "print reverse(<>)"'
JJoao
источник
1
Это просто заставило меня узнать, что <>читать не только из STDIN, но, возможно, из @ARGV. stackoverflow.com/questions/29020883/… Я до сих пор не знаю reverse, загрузит ли весь файл в память перед выводом строк в обратном порядке. Это было бы ужасно.
Бруно Броноски
@BrunoBronosky,> ... STDIN, но необязательно от @ ARGV: да, для этого <>. > ... загрузит весь файл в память ...: ДА, ЭТО БУДЕТ! (избегайте делать это с гигабайтовыми файлами)
JJoao