Привет, Хабр! Часто ли Вы сталкиваетесь с необходимостью искать в закладках/заметках "ту самую" важную, но редко необходимую команду? git log, который Вы не использовали полгода или спасительный docker compose с десятком флагов. Нередко подобный поиск превращается в пятиминутный квест.

В статье напишем функцию cheat, которая дополнит терминал личной "базой знаний" с Вашим личным перечнем команд. Вводим cheat docker - получаем проверенный список команд мгновенно, без поиска в браузере и чтения мануалов.

Введение

Думаю, у многих в арсенале есть свой набор команд, которые не помещаются в голове, редко используются (в последствии забываются). git, docker, спасительные команды - всё это часто копится в виде закладок в браузере, хаотичных файлов и прочих способов сохранения информации.

Постоянно гуглить или лезть в файл - неэффективно, отвлекает, создаёт лишние действия. Есть готовые утилиты вроде cheat.sh, но они не помогут, когда необходимо записать свою уникальную команду.

В этой статье разберу bash-функцию cheat. Она может:

  1. Хранить личные шпаргалки в текстовом файле.

  2. Мгновенно показывать их по ключевому слову.

К концу статьи у нас будет работающая команда cheat, которую можно расширять под свои нужды. К примеру, вызов cheat docker покажет личный список важных docker-команд.

1. Создание функции

Bash-функции, которые должны быть доступны всегда, принято прописывать в файле ~/.bashrc (для bash) или ~/.zshrc (для zsh). При старте терминала этот файл автоматически выполняется.

Откроем в редакторе. Я буду использовать nano, Вы можете выбрать свой:

nano ~/.bashrc

Если Вы используете Zsh, замените ~/.bashrc на ~/.zshrc

Почему в ~/.bashrc? Это надёжнее, чем создание отдельного исполняемого файла. Функция будет частью сессии и доступа в любом каталоге.

Прокрутите файл до самого конца и добавьте следующий код. Я подробно прокомментирую каждую строчку.

# Персональная система шпаргалок (cheat sheets)
cheat() {
    # Путь к файлу, где будут храниться шпаргалки
    local CHEAT_FILE=~/.cheatsheet

    # Если файла еще нет, создаем его
    if [[ ! -f "$CHEAT_FILE" ]]; then
        touch "$CHEAT_FILE"
        echo "Файл для шпаргалок создан: $CHEAT_FILE"
    fi

    # Если функция вызвана без аргументов - показываем весь файл
    if [[ $# -eq 0 ]]; then
        cat "$CHEAT_FILE"
        return
    fi

    # Ищем ключевое слово в файле и выводим найденный блок
    awk -v keyword="$1" '
        $0 ~ "^- " keyword " -$" { found=1; print; next }
        found && /^- [a-zA-Z0-9]+ -$/ { found=0 }
        found { print }
    ' "$CHEAT_FILE"
}

Распишу подробнее, что к чему:

  • local CHEAT_FILE=~/.cheatsheet - мы объявляем переменную с путем к нашему файлу-хранилищу.

  • Проверка if [[ ! -f "$CHEAT_FILE" ]] и команда touch создают файл при первом запуске, чтобы избежать ошибки.

  • Проверка if [[ $# -eq 0 ]] срабатывает, если мы вызвали cheat без аргументов. В этом случае просто показывается всё содержимое файла.

  • Поиск по ключевом слову происходит в awk. Разберём логику:

    1. -v keyword="$1" - передаем в awk первый аргумент функции (например, docker) как переменную keyword.

    2. $0 ~ "^- " keyword " -$" { found=1; print; next } - если строка соответствует шаблону - docker - (где docker - наш ключ), мы устанавливаем флаг found=1, печатаем эту строку-заголовок и переходим к следующей строке (next).

    3. found && /^- [a-zA-Z0-9]+ -$/ { found=0 } - если флаг found установлен и мы встречаем новую строку-заголовок (например, - git -), это значит, что блок с нашими командами закончился. Сбрасываем флаг found=0.

    4. found { print } - пока флаг found поднят, печатаем все строки. Это и есть наши команды внутри блока.

Функция добавлена в файл, но текущая сессия терминала об этом "не знает". Нужно перезагрузить. Делается это одной командой:

source ~/.bashrc

Или source ~/.zshrc, если вы используете Zsh

2. Наполняем "базу знаний"

Тут всё просто, приступаем к созданию самих шпаргалок. Я буду просто добавлять их в текстовый файл ~/.cheatsheet.

Откроем файл для редактирования:

nano ~/.cheatsheet

И добавим, к примеру, следующие блоки:

- docker -
# Остановить и удалить все контейнеры
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
# Показать логи запущенного контейнера
docker logs -f 
# Удалить все неиспользуемые образы, контейнеры, volumes и сети
docker system prune -a --volumes

- git -
# Красивый граф коммитов в одну строку
git log --oneline --graph --all
# Восстановить удаленный файл из последнего коммита
git checkout HEAD -- 
# Переименовать последний коммит
git commit --amend

- ffmpeg -
# Конвертировать видео в MP4 (H.264)
ffmpeg -i input.mov -vcodec h264 -acodec aac output.mp4
# Извлечь аудиодорожку из видео
ffmpeg -i input.mp4 -vn -acodec copy output.aac

Очень важно соблюдать строгий формат (дабы не ломать логику awk): каждая тема должна начинаться со строки - ключевое_слово -. Команды и комментарии пишутся до следующего заголовка.

Результат и проверка

В целом, мы закончили. Можно протестировать:

Шпаргалка по docker:

cheat docker
Вывод cheat docker
Вывод cheat docker

Шпаргалка по git:

cheat git
Вывод chea git
Вывод chea git

Запуск без аргументов:

cheat
Вывод cheat. Покажет весь список из файла
Вывод cheat. Покажет весь список из файла

Заключение

За несколько минут была создана достаточно полезная система для хранения шпаргалок в терминале. Никаких дополнительных пакетов не требуется, список команд легко редактируется.

Ещё варианты ~/.cheatsheet

Дополнительно, хотелось бы привести разные примеры "шпаргалок", возможно кому-то будет полезно. Анализ сети и процессов:

- network -
# Показать все открытые сетевые соединения и процессы
ss -tulpn
# Найти процесс, занимающий конкретный порт
lsof -i :8080
# Мониторинг сетевых интерфейсов в реальном времени
iftop
# Постоянный пинг с временной меткой
ping -D 8.8.8.8
# Трассировка маршрута с AS номерами
mtr --aslookup google.com

- debug -
# Поиск по запущенным процессам
ps aux | grep -i nginx
# Показать открытые файлы процесса
lsof -p <PID>
# Мониторинг использования диска в реальном времени
iotop
# Статистика использования памяти процессами
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -20
# Детальная информация о процессе
cat /proc/<PID>/status

- ports -
# Какие порты слушаются
netstat -tulpn | grep LISTEN
# Проверить доступность порта удаленно
nc -zv example.com 80
# Сканирование открытых портов на localhost
nmap -sT -O localhost
# Какие порты открыты наружу
ss -tulpn | grep -E ':(80|443|22|53)'

Для повседневной работы:

- git-advanced -
# Отменить последний коммит, сохраняя изменения в рабочей директории
git reset --soft HEAD~1
# Временно спрятать изменения и вернуться к чистому состоянию
git stash
# Вернуть спрятанные изменения
git stash pop
# Просмотреть историю коммитов с изменениями за последнюю неделю
git log --since="1 week ago" --oneline --graph
# Безопасно переписать историю последних 3 коммитов
git rebase -i HEAD~3

- docker-cleanup -
# Удалить все остановленные контейнеры
docker container prune -f
# Удалить все неиспользуемые образы
docker image prune -a
# Очистить всё: контейнеры, образы, сети, билд-кэш
docker system prune -a --volumes
# Показать детальное использование диска Docker
docker system df

- system-info -
# Показать информацию о дисковом пространстве в человекочитаемом формате
df -h
# Детальная информация об использовании памяти
free -h
# Температура компонентов системы
sensors
# Информация о процессе в реальном времени
htop
# Показать загрузку CPU по ядрам
mpstat -P ALL

- text-processing -
# Поиск рекурсивно по файлам с подсветкой
grep -r "pattern" . --color=auto
# Замена текста в нескольких файлах
find . -name "*.txt" -exec sed -i 's/old/new/g' {} \;
# Подсчет строк в проекте
find . -name "*.py" | xargs wc -l
# Показать первые 10 самых частых слов в файле
cat file.txt | tr ' ' '\n' | sort | uniq -c | sort -nr | head -10

- ssh-keys -
# Сгенерировать новый SSH ключ
ssh-keygen -t ed25519 -C "your_email@example.com"
# Скопировать SSH ключ на сервер
ssh-copy-id user@hostname
# Проверить подключение к SSH без пароля
ssh -o PreferredAuthentications=publickey user@hostname
# Показать fingerprint ключа
ssh-keygen -lf ~/.ssh/id_ed25519

P. S. В моей группе в Телеграмм разбираем практические кейсы: скрипты (Python/Bash/PowerShell), тонкости ОС и инструменты для эффективной работы.