Привет, Хабр! Часто ли Вы сталкиваетесь с необходимостью искать в закладках/заметках "ту самую" важную, но редко необходимую команду? git log, который Вы не использовали полгода или спасительный docker compose с десятком флагов. Нередко подобный поиск превращается в пятиминутный квест.
В статье напишем функцию cheat, которая дополнит терминал личной "базой знаний" с Вашим личным перечнем команд. Вводим cheat docker - получаем проверенный список команд мгновенно, без поиска в браузере и чтения мануалов.
Введение
Думаю, у многих в арсенале есть свой набор команд, которые не помещаются в голове, редко используются (в последствии забываются). git, docker, спасительные команды - всё это часто копится в виде закладок в браузере, хаотичных файлов и прочих способов сохранения информации.
Постоянно гуглить или лезть в файл - неэффективно, отвлекает, создаёт лишние действия. Есть готовые утилиты вроде cheat.sh, но они не помогут, когда необходимо записать свою уникальную команду.
В этой статье разберу bash-функцию cheat. Она может:
Хранить личные шпаргалки в текстовом файле.
Мгновенно показывать их по ключевому слову.
К концу статьи у нас будет работающая команда 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. Разберём логику:-v keyword="$1"- передаем в awk первый аргумент функции (например,docker) как переменнуюkeyword.$0 ~ "^- " keyword " -$" { found=1; print; next }- если строка соответствует шаблону- docker -(гдеdocker- наш ключ), мы устанавливаем флагfound=1, печатаем эту строку-заголовок и переходим к следующей строке (next).found && /^- [a-zA-Z0-9]+ -$/ { found=0 }- если флагfoundустановлен и мы встречаем новую строку-заголовок (например,- git -), это значит, что блок с нашими командами закончился. Сбрасываем флагfound=0.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

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

Запуск без аргументов:
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), тонкости ОС и инструменты для эффективной работы.
