Справочник · Терминал и система
Команды Linux на каждый день
Файлы, поиск, текст, процессы, диски и сеть: короткая шпаргалка по командам, которые набираешь чаще всего, с ключами, которые действительно пригождаются.
Эта шпаргалка про обычный Linux с GNU-утилитами: Ubuntu, Debian, Fedora и их родственники. На macOS многие команды есть, но ключи иногда отличаются, об этом сказано рядом.
Навигация и файлы
| Команда | Что делает |
|---|---|
pwd | показать текущую папку |
cd - | вернуться в предыдущую папку |
cd ~ или просто cd | перейти в домашнюю папку |
ls -lah | список с правами, размерами в удобном виде и скрытыми файлами |
ls -lt | сортировка по времени изменения, новые сверху |
tree -L 2 | дерево папок на два уровня (пакет tree) |
mkdir -p a/b/c | создать вложенные папки, без ошибки, если уже есть |
cp -a src dst | копировать с сохранением прав, владельца и дат |
mv old new | переместить или переименовать |
rm -r dir | удалить папку с содержимым |
ln -s target link | создать символическую ссылку |
touch file | создать пустой файл или обновить дату изменения |
stat file | все сведения о файле: размер, права, даты, inode |
file x.bin | определить тип файла по содержимому |
Просмотр и поиск текста
cat file.txt # вывести файл целиком
less file.log # постраничный просмотр: / поиск, n следующее, q выход
head -n 20 file # первые 20 строк
tail -n 50 file # последние 50 строк
tail -f app.log # следить за файлом в реальном времени
wc -l file # число строкПоиск по содержимому делается через grep:
| Ключ | Смысл |
|---|---|
grep -i | без учёта регистра |
grep -r | рекурсивно по папке |
grep -n | показать номера строк |
grep -v | строки, где совпадения нет |
grep -E | расширенные регулярные выражения: +, ?, |, () без экранирования |
grep -o | вывести только совпавшую часть |
grep -l | только имена файлов с совпадениями |
grep -C 3 | по три строки контекста до и после |
grep -w | только целые слова |
grep -rn "TODO" src/ # все TODO с номерами строк
grep -rE "error|fail" --include='*.log' .
grep -c "200 OK" access.log # сколько строк совпалоЕсли установлен ripgrep, команда rg делает то же быстрее и сама пропускает файлы из .gitignore. Регулярные выражения удобно отлаживать в тестере регулярок.
Поиск файлов
find . -name '*.py' # по имени, шаблон в кавычках
find . -iname 'readme*' # без учёта регистра
find . -type d -name node_modules # только папки
find . -type f -size +100M # файлы больше 100 МБ
find . -mtime -1 # изменённые за последние сутки
find . -name '*.tmp' -delete # найти и удалить
find . -name '*.sh' -exec chmod +x {} + # выполнить команду над найденнымКавычки вокруг шаблона нужны, иначе оболочка сама раскроет *.py в имена файлов текущей папки до того, как find их увидит.
Для быстрого поиска по имени по всему диску есть locate (пакет plocate), он ищет по базе, которая обновляется командой updatedb.
Обработка текста в конвейере
Сила командной строки в том, что маленькие команды соединяются через |: вывод одной становится входом другой.
| Команда | Пример | Что делает |
|---|---|---|
sort | sort -n -k2 | сортировка, -n числовая, -k2 по второму полю, -r обратная |
uniq | sort | uniq -c | убрать повторы подряд, -c посчитать их |
cut | cut -d: -f1 /etc/passwd | вырезать поле по разделителю |
tr | tr 'a-z' 'A-Z' | заменить или удалить символы |
sed | sed 's/old/new/g' | замена по шаблону в потоке |
awk | awk '{print $1}' | разбор полей, подсчёты |
xargs | xargs -n1 | превратить строки в аргументы команды |
tee | cmd | tee out.txt | вывести на экран и записать в файл |
diff | diff -u a b | сравнить файлы построчно |
Несколько рабочих примеров:
# десять самых частых IP в журнале веб-сервера
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head
# заменить строку во всех файлах на месте (GNU sed)
sed -i 's/localhost:5432/db:5432/g' config/*.env
# сумма значений из третьей колонки CSV
awk -F, '{s += $3} END {print s}' data.csv
# удалить пустые строки
sed '/^$/d' file.txtПроцессы
| Команда | Что делает |
|---|---|
ps aux | все процессы всех пользователей |
ps aux | grep nginx | найти процесс по имени |
pgrep -a python | то же короче, с командной строкой |
top или htop | живой список процессов, нагрузка, память |
kill PID | вежливо попросить завершиться (сигнал TERM) |
kill -9 PID | убить без шансов (KILL), только если TERM не помог |
pkill -f 'node server' | завершить по части командной строки |
jobs, fg, bg | задачи текущей оболочки |
Ctrl+Z | приостановить процесс, потом bg отправит его в фон |
nohup cmd & | запустить так, чтобы процесс пережил закрытие терминала |
lsof -i :8080 | кто слушает порт 8080 |
Чтобы долгая команда продолжала работать после отключения от сервера, удобнее всего tmux: tmux new -s work, отключиться Ctrl+B, затем D, вернуться tmux attach -t work.
Диски и память
df -h # свободное место на разделах
du -sh * # размер каждого элемента в текущей папке
du -sh * | sort -h # то же, отсортированное по размеру
free -h # оперативная память и swap
lsblk # диски и разделы деревомЕсли диск заполнен, а du не находит виновника, проверьте удалённые, но ещё открытые файлы: lsof +L1. Место освободится, когда процесс закроет файл или перезапустится.
Сеть
| Команда | Что делает |
|---|---|
ip a | адреса сетевых интерфейсов |
ip r | таблица маршрутов |
ss -tlnp | какие TCP-порты слушаются и какими процессами |
ping -c 4 host | проверить доступность, четыре пакета |
dig host +short | узнать IP по имени (пакет dnsutils или bind-utils) |
curl -I localhost:8080 | заголовки ответа веб-сервера |
nc -zv host 5432 | проверить, открыт ли порт |
scp file user@host:/path | скопировать файл на другую машину |
rsync -avz src/ user@host:dst/ | синхронизировать папки, передавая только изменения |
Подробнее про запросы из терминала есть в шпаргалке по curl, про маски и диапазоны адресов поможет калькулятор подсетей.
Архивы
tar -czf backup.tar.gz dir/ # упаковать в .tar.gz
tar -xzf backup.tar.gz # распаковать
tar -xzf backup.tar.gz -C /opt # распаковать в указанную папку
tar -tzf backup.tar.gz # посмотреть содержимое, не распаковывая
zip -r site.zip site/ # zip-архив
unzip site.zip -d out/Буквы в tar запоминаются так: c создать, x извлечь, t показать список, z сжатие gzip, f имя файла (идёт последним перед именем), v подробный вывод. Для .tar.xz вместо z используется J, для .tar.zst ключ --zstd.
Пользователи и система
whoami # кто я
id # мой UID, GID и группы
sudo -i # оболочка root
uname -a # ядро и архитектура
cat /etc/os-release # дистрибутив и версия
uptime # сколько работает система и средняя нагрузка
systemctl status nginx # состояние службы
journalctl -u nginx -f # журнал службы в реальном времени
journalctl --since "1 hour ago"
history | grep docker # найти команду в историиПрава на файлы и владельцы разобраны отдельно в статье про chmod, а запуск команд по расписанию в статье про cron.