Linux: шпаргалка по командам — bash, права, процессы, grep/sed/awk, перенаправление, хоткеи
Linux — основа серверной разработки и DevOps. Шпаргалка охватывает повседневные команды, перенаправление, хоткеи и диагностику реальных проблем.
Горячие клавиши терминала
| Сочетание | Действие |
|---|---|
Ctrl+R |
Интерактивный поиск по истории (нажмите ещё раз — следующее совпадение) |
Ctrl+A / Ctrl+E |
В начало / конец строки |
Ctrl+U / Ctrl+K |
Удалить от курсора до начала / до конца строки |
Ctrl+W |
Удалить слово перед курсором |
Ctrl+L |
Очистить экран (аналог clear) |
Ctrl+C |
Прервать текущий процесс (SIGINT) |
Ctrl+D |
EOF (выйти из shell, закрыть stdin) |
Ctrl+Z |
Приостановить процесс (SIGTSTP), fg вернуть, bg в фон |
Tab |
Автодополнение (двойной Tab — показать варианты) |
!! |
Повторить последнюю команду |
sudo !! |
Повторить последнюю команду с sudo |
!$ |
Последний аргумент предыдущей команды |
!123 |
Выполнить команду #123 из history |
Перенаправление и коннекторы
# Стандартные потоки: stdin(0), stdout(1), stderr(2)
cmd > file # stdout в файл (перезапись)
cmd >> file # stdout в файл (добавление)
cmd < file # stdin из файла
cmd 2> file # stderr в файл
cmd > file 2>&1 # stdout и stderr в один файл
cmd &> file # то же самое (bash)
cmd > /dev/null 2>&1 # скрыть весь вывод
# Пайпы — передача stdout → stdin
cmd1 | cmd2 # вывод cmd1 на вход cmd2
cmd1 | tee file # вывод и в файл, и дальше в пайп
# Коннекторы
cmd1 && cmd2 # cmd2 только если cmd1 успешно (exit 0)
cmd1 || cmd2 # cmd2 только если cmd1 с ошибкой
cmd1 ; cmd2 # cmd2 всегда, независимо от результата
# Коды возврата
echo $? # код возврата последней команды (0 = успех)
true && echo "OK" # true возвращает 0
false || echo "FAIL" # false возвращает 1
Файловая система и навигация
# Навигация
pwd && ls -la && ls -ltr # список + сортировка по времени
tree -L 2 # дерево, глубина 2
cd - # предыдущая директория
pushd /tmp && popd # временный переход
# Поиск файлов
find . -name "*.log" -type f -mtime -7 # логи за 7 дней
find . -size +100M # > 100MB
find . -name "*.tmp" -delete # найти и удалить
find . -type f -exec chmod 644 {} + # выполнить над найденным
locate nginx.conf # быстрый поиск (sudo updatedb)
# Просмотр
cat / head -n 20 / tail -n 100 / less / wc -l file
tail -f app.log # follow
du -sh * | sort -rh | head -10 # топ-10 по размеру
du -ahx . | sort -rh | head -5 # топ-5 файлов (без других ФС)
df -h && df -i # место и inodes
stat file # все метаданные
Права доступа: две нотации
# Символьная нотация: u(user) g(group) o(others) a(all)
chmod u+x script.sh # user + execute
chmod go-w file.txt # group и others убрать write
chmod ug=rw,o=r file.txt # user/group=rw, others=r
chmod a+x script.sh # всем + execute
# Числовая нотация: r=4, w=2, x=1
chmod 755 script.sh # rwxr-xr-x (4+2+1=7, 4+0+1=5, 4+0+1=5)
chmod 644 file.txt # rw-r--r--
chmod 600 secret.key # только владелец
chmod 777 public/ # всем всё (опасно!)
# Таблица:
# 7 = rwx 6 = rw- 5 = r-x 4 = r--
# 3 = -wx 2 = -w- 1 = --x 0 = ---
# Первая цифра: владелец, вторая: группа, третья: остальные
# Смена владельца
chown user:group file && chown -R user:group dir/
# Специальные биты и атрибуты
chmod 1777 /tmp # sticky bit (только владелец удаляет)
chattr +i important.txt # immutable (даже root не удалит)
lsattr file && chattr -i file
Процессы
ps aux | grep nginx # поиск
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head # топ по памяти
pstree -p # дерево
top -u username # процессы пользователя
kill PID # SIGTERM (15) — вежливо
kill -9 PID # SIGKILL — жёстко
killall name # все процессы по имени
pkill -f "python" # убить по паттерну
# Фоновые процессы
cmd & # в фоне
Ctrl+Z → bg # приостановить → в фон
jobs && fg %1 # список → вернуть задачу 1
nohup cmd & && disown # не убивать при выходе
# Приоритет
nice -n 10 cmd # низкий приоритет (-20..19, меньше = выше)
renice -n 5 -p PID # изменить запущенному
Системная информация и память
uname -a && lsb_release -a && hostnamectl
uptime && free -h && lscpu && lsblk
dmesg | tail -50 # ядро
journalctl -u nginx -f # логи сервиса
journalctl --since "1 hour ago"
# Диагностика «No space»
df -h && df -i # блоки и inodes
du -sh /* | sort -rh | head -20 # кто занимает
lsof | grep deleted # файлы, занятые процессами
# Память
vmstat 1 && cat /proc/meminfo
# Очистка
journalctl --vacuum-size=500M
docker system prune -a
Сеть
ip a && ip route # интерфейсы и маршруты
ss -tlnp # слушающие TCP (PID/процесс)
ss -tlnp | grep :8080 # кто на порту
lsof -i :8080 # альтернатива
ss -tan state time-wait | wc -l # сколько TIME_WAIT
ping -c 3 host # доступность
traceroute host && nslookup domain && dig domain ANY
curl -v https://example.com # детальный HTTP
curl -I https://example.com # только заголовки
wget -O file url && nc -zv host 443 # TCP-порт
# Файрвол
iptables -L -n -v
# ufw (Ubuntu): ufw enable / ufw allow 80 / ufw status
grep, sed, awk
# grep
grep -i -r "pattern" dir/ # рекурсивно, без регистра
grep -E "pat1|pat2" file # расширенный regex
grep -P "\d{3}-\d{2}" file # Perl-совместимый regex
grep -v "exclude" file # исключить
grep -c "pattern" file # подсчёт
grep -n -A 3 -B 2 "pattern" file # контекст + номера строк
grep -l "TODO" *.js # только имена файлов
grep --color=auto "pattern" file # подсветка
# sed
sed 's/old/new/' file # первая замена в строке
sed 's/old/new/g' file # все замены
sed -i 's/old/new/g' file # на месте (⚠️ перезапись)
sed -i.bak 's/old/new/g' file # с бэкапом
sed '/^$/d' file # удалить пустые строки
sed -n '5,10p' file # строки 5-10
sed '/start/,/end/d' file # удалить блок между паттернами
# awk
awk '{print $1, $NF}' file # первый и последний столбец
awk -F: '{print $1, $7}' /etc/passwd # свой разделитель
awk '$3 > 1000 {print $1}' file # условие
awk '{sum += $2} END {print "Sum:", sum}' file # сумма
awk '{count[$1]++} END {for (w in count) print w, count[w]}' | sort -rn -k2 | head # частотный топ
awk 'NR==FNR {map[$1]=$2; next} {print $0, map[$1]}' f1 f2 # JOIN (NR=общий, FNR=текущий)
Systemd
systemctl start|stop|restart|reload|enable|disable|status nginx
systemctl is-enabled nginx
journalctl -u nginx -f --since today
systemctl list-timers # таймеры (cron-альтернатива)
systemctl list-units --state=failed # упавшие сервисы
Пользователи и история
who && w && id
useradd -m -s /bin/bash user && usermod -aG docker user
passwd user && su - user && sudo -i
# История
history | grep git
!123 && !! && sudo !! # повторить команду / последнюю / с sudo
^old^new # заменить в последней команде и выполнить
export HISTTIMEFORMAT="%F %T " # дата в истории
export HISTSIZE=10000 # размер истории
Пакетные менеджеры
# apt (Debian/Ubuntu)
apt update && apt upgrade && apt install pkg && apt search keyword
apt autoremove --purge # удалить сиротские пакеты
# dnf (RHEL/Fedora)
dnf install pkg && dnf update && dnf search keyword
Алиасы и конфигурация
# ~/.bashrc или ~/.bash_aliases
alias ll="ls -la"
alias la="ls -A"
alias ..="cd .."
alias ...="cd ../.."
alias grep="grep --color=auto"
# Защита от дурака
alias rm="rm -i"
alias cp="cp -i"
alias mv="mv -i"
# Полезные
alias ports="ss -tlnp"
alias myip="curl -s ifconfig.me"
alias df="df -h"
alias free="free -h"
alias psg="ps aux | grep -v grep | grep"
alias untar="tar -xzf"
alias serve="python3 -m http.server"
Bash-однострочники
# Заменить текст во всех файлах
find . -name "*.txt" -exec sed -i 's/old/new/g' {} +
# Убить процессы по имени
ps aux | grep process | awk '{print $2}' | xargs kill
# Топ-10 больших файлов
find . -type f -exec du -h {} + | sort -rh | head -10
# Удалить файлы старше 30 дней
find /logs -name "*.log" -mtime +30 -delete
# Мониторинг лога с фильтрацией
tail -f app.log | grep --line-buffered "ERROR"
# Архивация
tar -czf archive.tar.gz dir/ && tar -xzf archive.tar.gz
curl -s url | tar -xz # скачать и распаковать
# Частотный анализ
sort file | uniq -c | sort -rn | head -10
# Параллельное выполнение
echo "h1 h2 h3" | xargs -n1 -P3 ssh {} 'uptime'
# Быстрый HTTP-сервер
python3 -m http.server 8000
Реальные проблемы: диагностика и решение
«Permission denied» — 5 причин
# 1. Обычные права → ls -la → chmod/chown
# 2. Родительская директория без +x → ls -ld /path → chmod +x dir
# 3. SELinux/AppArmor → ls -Z file → getenforce → chcon/setenforce 0
# 4. Immutable → lsattr file → chattr -i file
# 5. noexec mount → mount | grep noexec
# Полный трейс: namei -l /full/path/to/file
«No space left on device» — но df показывает место
df -i # inodes закончились? (много мелких файлов)
lsof | grep deleted # удалённые файлы, занятые процессами
# Решение: перезапустить процесс, держащий deleted-файлы
«Address already in use» — порт занят
ss -tlnp | grep :PORT # кто слушает
fuser -k PORT/tcp # убить процесс на порту
sysctl net.ipv4.tcp_tw_reuse=1 # для TIME_WAIT
Процесс не убивается через kill -9
ps aux | awk '$8 ~ /D/' # D-state = uninterruptible sleep
# kill -9 бессилен. Причина: I/O (NFS-таймаут, диск)
# Решение: восстановить I/O или перезагрузка
«Too many open files» — ulimit
ulimit -n # текущий лимит
ulimit -n 65536 # увеличить (временно)
lsof -p PID | wc -l # сколько открыто
# Постоянно: /etc/security/limits.conf
Высокая нагрузка
uptime # load average (1, 5, 15 мин)
top -o %CPU # кто грузит CPU
iostat -x 1 # дисковая нагрузка
Частые проблемы и их решения
| Проблема | Диагностика | ✅ Решение |
|---|---|---|
| «Permission denied» | ls -la + lsattr + namei -l /path |
chmod, chown, chattr -i, SELinux |
| «No space» при df с местом | df -i + lsof | grep deleted |
inodes или перезапуск процессов |
| Порт занят | ss -tlnp | grep PORT |
kill PID / сменить порт |
| Процесс не убивается | ps aux | awk '$8 ~ /D/' |
D-state — решить I/O |
| Высокий LA | uptime + top + iostat |
Найти и оптимизировать процесс |
| OOM Killer | dmesg | grep -i oom |
Увеличить память/лимиты |
| DNS не работает | nslookup google.com + ping 8.8.8.8 |
/etc/resolv.conf |
Полезные ресурсы
- explainshell.com — разбор любой команды
- tldr.sh — краткие примеры (
tldr tar) - cheat.sh —
curl cheat.sh/tar - Bash Hackers Wiki — продвинутый bash
Что дальше
- Шпаргалка по Docker — контейнеризация
- Шпаргалка по Kubernetes — оркестрация
- Шпаргалка по Git Advanced — версионирование
- Шпаргалка по curl — HTTP из командной строки
Связанные шпаргалки: Docker, Kubernetes, Git Advanced, curl, awk, Си, C++, Rust, Go