Привет, Хабр! Часто ли Вы сталкиваетесь с необходимостью искать в закладках/заметках "ту самую" важную, но редко необходимую команду? 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), тонкости ОС и инструменты для эффективной работы.