Лаборатория кодера

Справочник · Терминал и система

Команды Linux на каждый день

Файлы, поиск, текст, процессы, диски и сеть: короткая шпаргалка по командам, которые набираешь чаще всего, с ключами, которые действительно пригождаются.

Обновлено · 8 мин чтения

Эта шпаргалка про обычный 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определить тип файла по содержимому

Просмотр и поиск текста

bash
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только целые слова
bash
grep -rn "TODO" src/                    # все TODO с номерами строк
grep -rE "error|fail" --include='*.log' .
grep -c "200 OK" access.log             # сколько строк совпало

Если установлен ripgrep, команда rg делает то же быстрее и сама пропускает файлы из .gitignore. Регулярные выражения удобно отлаживать в тестере регулярок.

Поиск файлов

bash
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.

Обработка текста в конвейере

Сила командной строки в том, что маленькие команды соединяются через |: вывод одной становится входом другой.

КомандаПримерЧто делает
sortsort -n -k2сортировка, -n числовая, -k2 по второму полю, -r обратная
uniqsort | uniq -cубрать повторы подряд, -c посчитать их
cutcut -d: -f1 /etc/passwdвырезать поле по разделителю
trtr 'a-z' 'A-Z'заменить или удалить символы
sedsed 's/old/new/g'замена по шаблону в потоке
awkawk '{print $1}'разбор полей, подсчёты
xargsxargs -n1превратить строки в аргументы команды
teecmd | tee out.txtвывести на экран и записать в файл
diffdiff -u a bсравнить файлы построчно

Несколько рабочих примеров:

bash
# десять самых частых 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.

Диски и память

bash
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, про маски и диапазоны адресов поможет калькулятор подсетей.

Архивы

bash
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.

Пользователи и система

bash
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.