Есть стандартный сценарий работы с CSV в терминале: открываешь файл через cat, получаешь кашу. Пробуешь column -t - уже лучше, но цвета нет, длинные значения обрезаются криво, а про автоопределение разделителя можно забыть. Открываешь LibreOffice Calc - и вот ты уже ждёшь три секунды загрузки ради того, чтобы глянуть на 20 строк.
tennis решает именно эту задачу: берёт CSV (или TSV, или с разделителем-точкой с запятой - сам разберётся), рисует аккуратную таблицу с рамкой, цветами и выравниванием, вписывает её в ширину текущего окна терминала. Весит бинарник меньше двух мегабайт. Аккаунт не нужен.
Для кого это и для кого нет
Инструмент попадает в точку, если ты регулярно работаешь с данными в терминале: смотришь логи в CSV, проверяешь экспорты из баз, быстро оцениваешь структуру файла перед обработкой. Одна команда - и таблица читается.
Если нужно фильтровать, сортировать, джойнить или делать агрегации - tennis не для этого. Разработчик честно указывает в README альтернативы: qsv для трансформаций, miller для обработки, visidata для интерактивного исследования больших файлов. tennis - это про быстрый просмотр, не про аналитику.
Ещё один честный момент: проект молодой, версия 0.0.3 вышла в марте 2026-го. Часть заявленных фич - сортировка, выбор колонок, режим пейджера - пока в списке будущих задач, не в релизе. Устанавливаешь то, что есть сейчас, а не то, что обещано.
Что умеет из коробки
Автолейаут - главная фича. tennis смотрит на ширину окна терминала и подгоняет под неё таблицу: колонки сжимаются пропорционально, длинные значения обрезаются с многоточием. Никакой горизонтальной прокрутки.
Автотема - неочевидный плюс. Утилита определяет цвет фона терминала (светлый или тёмный) и выбирает подходящую цветовую схему. Это работает через собственный модуль termbg.zig - по словам автора, аналогов для Zig до этого не существовало. На практике: заголовки колонок подсвечены, числа выровнены по правому краю, читается комфортно.
Автоформат чисел - удобно, когда колонка содержит 1234567.89: tennis сам добавляет разделители тысяч и округляет до нужного количества знаков. Если форматирование мешает, отключается флагом --vanilla.
Автоопределение разделителя: запятая, табуляция, точка с запятой, пайп - утилита пробует сама. Можно переопределить через --delimiter.
Остальные опции - утилитарные: --head N и --tail N показывают первые или последние N строк (удобно для больших файлов), --row-numbers добавляет нумерацию, --title добавляет заголовок над таблицей, --border меняет стиль рамки (rounded, thin, double и другие варианты из Nushell).
Установка
На macOS - через Homebrew:
brew install gurgeous/tap/tennis
Одна строка, ничего лишнего.
На Linux - скачиваешь бинарник с релизов на GitHub и кладёшь в любую папку из $PATH. Автор рекомендует ~/.local/bin - разумно, не требует прав root. В папке extra/ репозитория лежат опциональные дополнения: bash/zsh-автодополнение и man-страница.
Сборка из исходников требует Zig и mise (менеджер версий инструментов). Если уже работаешь с Zig-проектами - стандартный процесс, ничего неожиданного.
Почему Zig - это не проблема
Zig - компилируемый системный язык, конкурент C в нише низкоуровневого кода. Для пользователя это означает одно: бинарник без зависимостей. Не нужен Python, Node, Ruby или что-то ещё. Скачал - запустил. Именно поэтому утилита весит меньше двух мегабайт и стартует мгновенно.
Молодость языка - честный риск. Экосистема меньше, разработчиков меньше, вероятность заброшенного репозитория статистически выше, чем у проекта на Go или Rust. 366 звёзд на GitHub - небольшая аудитория. Но MIT-лицензия и открытый код означают: даже если автор пропадёт, форкнуть и допилить под себя никто не запрещает.
Сравнение с тем, что уже есть
column -t из coreutils - есть везде, не требует установки, но не умеет цвета, автолейаут и форматирование чисел. Для разовой задачи достаточно, для регулярной работы - нет.
csvlens и tabiew - интерактивные TUI-вьюверы с навигацией, поиском, фильтрацией. Мощнее, но требуют взаимодействия. tennis - это cat, только красивый: одна команда, вывод в stdout, можно пайпить дальше.
visidata - другая лига. Полноценная интерактивная среда для анализа данных. Если файл большой и нужно в нём копаться - visidata. Если нужно быстро глянуть структуру перед следующим шагом в пайпе - tennis.
Спорное утверждение: большинству задач «посмотреть CSV в терминале» не нужен интерактивный вьювер. Нужен быстрый вывод в stdout, который можно передать в grep или less. tennis делает именно это - и не пытается стать чем-то большим.
Что раздражает
Проект в активной разработке, и это чувствуется. Сортировка строк, выбор конкретных колонок, режим --watch для обновляющихся файлов - всё это в списке «Future Work», не в релизе. Если ты читаешь это через полгода после публикации - проверь changelog, возможно, часть уже появилась.
Цвет включён по умолчанию и не отключается автоматически при пайпинге в файл. Если делаешь tennis data.csv > output.txt - в файл попадут ANSI-коды. Решается флагом --color off, но это надо помнить.
Документация минимальная: README, man-страница и --help. Для утилиты такого масштаба этого достаточно, но не рассчитывай на подробные примеры под каждый сценарий.
Если cat data.csv у тебя давно вызывает рефлекторное раздражение - tennis стоит попробовать. Бинарник, одна команда, никаких зависимостей. Либо зайдёт сразу, либо вернёшься к column -t через пять минут - ничего не потеряешь.
А что используешь для работы с CSV в терминале прямо сейчас - column -t, visidata или что-то ещё?
Источник: tennis on GitHub
🔔 Подписывайся на КликХак - разбираем инструменты, которые реально используются, а не те, что красиво выглядят в презентациях.