Справочники
Справочник Linux-команд
find, grep, sed, awk, tar, rsync и systemctl — с пояснениями и подстановкой ваших путей.
Подставить свои значения
Значения подставляются прямо в команды — копируйте и вставляйте в терминал.
Показано 122 из 122 команд.
Поиск файлов — find
Условия складываются по «и»; -o даёт «или», скобки экранируются: \( … \).
find . -name "*.log"
Файлы по имени с учётом регистра.
find . -iname "*readme*"
То же без учёта регистра.
find . -type d -name node_modules -prune -o -type f -print
Обойти каталог целиком: -prune отсекает ветку до входа в неё.
find . -type f -size +100M
Файлы больше 100 МБ. +/- — больше/меньше, без знака — ровно.
find . -mtime -1
Изменённые за последние сутки. -mmin -30 — за полчаса.
find . -type f -newer file.txt
Изменённые позже указанного файла.
find . -type f -empty -delete
Удалить пустые файлы. -delete идёт последним аргументом.
find . -type f -perm 0777
Файлы с ровно такими правами. -perm -0002 — где есть запись для всех.
find . -type f -print0 | xargs -0 grep -l "TODO"
Передать список в другую команду безопасно для имён с пробелами.
find . -type f -exec chmod 644 {} +
+ собирает аргументы пачками, \; вызывает команду на каждый файл.
find . -maxdepth 1 -type l
Символические ссылки только на верхнем уровне.
find . -type f -printf "%s\t%p\n" | sort -rn | head
Топ самых больших файлов (GNU find).
Поиск по содержимому — grep
grep -rn "текст" .
Рекурсивно, с номерами строк.
grep -rni --include="*.js" "todo" .
Без учёта регистра, только в нужных файлах.
grep -rl "текст" .
Только имена файлов, где нашлось.
grep -c "ERROR" file.txt
Сколько строк совпало.
grep -v "^#" file.txt | grep -v "^$"
Конфиг без комментариев и пустых строк.
grep -A 3 -B 3 "ERROR" file.txt
Контекст: три строки после и три до. -C 3 — с обеих сторон.
grep -E "warn|error|fatal" file.txt
Расширенная регулярка: | без экранирования.
grep -P "\d{3}-\d{2}" file.txt
Perl-регулярки: \d, \s, ленивые квантификаторы (GNU grep).
grep -o "https\?://[^ ]*" file.txt
Печатать только совпавший кусок, а не всю строку.
grep -F -f patterns.txt file.txt
Искать буквальные строки списком из файла.
grep -w "id" file.txt
Только целое слово: «id» найдётся, «uuid» — нет.
zgrep "ERROR" /var/log/syslog.2.gz
Поиск прямо в gzip-логе, без распаковки.
Правка текста — sed
GNU sed: -i без аргумента. На macOS (BSD) нужно -i '' — иначе первый аргумент съест суффикс копии.
sed 's/было/стало/' file.txt
Заменить первое вхождение в каждой строке, вывести в консоль.
sed 's/было/стало/g' file.txt
g — все вхождения в строке.
sed -i.bak 's/было/стало/g' file.txt
Заменить в файле, сохранив копию .bak. Так работает и в GNU, и в BSD.
sed 's|/old/path|/new/path|g' file.txt
Разделитель — любой символ: с путями удобнее |.
sed -n '10,20p' file.txt
Напечатать строки с 10 по 20. -n гасит автопечать.
sed -n '/начало/,/конец/p' file.txt
Кусок между двумя шаблонами.
sed '/^#/d' file.txt
Удалить строки-комментарии.
sed '3i\новая строка' file.txt
Вставить строку перед третьей; a — после.
sed -E 's/([0-9]+)-([0-9]+)/\2-\1/' file.txt
Группы в расширенной регулярке, обратные ссылки \1 \2.
sed '$!N;s/\n/ /' file.txt
Склеить строки попарно.
Колонки и суммы — awk
awk '{print $1, $3}' file.txt
Первая и третья колонки; $0 — вся строка, NF — число колонок.
awk -F: '{print $1}' /etc/passwd
Свой разделитель полей.
awk '{sum += $2} END {print sum}' file.txt
Сумма колонки.
awk '{a[$1]++} END {for (k in a) print a[k], k}' file.txt | sort -rn
Частоты значений первой колонки — топ IP в логе.
awk 'NR > 1' file.txt
Пропустить заголовок CSV.
awk '$3 > 100 {print}' file.txt
Фильтр по числовому условию.
awk 'length > 80' file.txt
Строки длиннее 80 символов.
awk '!seen[$0]++' file.txt
Убрать дубли, сохранив порядок (sort -u порядок теряет).
awk 'BEGIN {OFS=","} {$1=$1; print}' file.txt
Перебить разделитель вывода: пробелы → запятые.
Архивы — tar, zip, gzip
Мнемоника tar: «c» create, «x» extract, «t» list, «f» file, «v» verbose, «z» gzip, «j» bzip2, «J» xz.
tar -czf archive.tar.gz .
Упаковать каталог с gzip-сжатием.
tar -xzf archive.tar.gz
Распаковать в текущий каталог.
tar -xzf archive.tar.gz -C /target/dir
Распаковать в указанный каталог.
tar -tzf archive.tar.gz
Посмотреть содержимое, ничего не распаковывая.
tar -czf archive.tar.gz --exclude=node_modules --exclude=.git .
Упаковать без мусора.
tar -xzf archive.tar.gz --strip-components=1
Убрать лишний верхний каталог из архива.
zip -r archive.zip . -x "*.git*"
ZIP рекурсивно с исключением.
unzip -l archive.zip
Список файлов в ZIP.
gzip -9 file.txt
Сжать файл на месте (исходник исчезает); gunzip — обратно.
tar -czf - . | ssh user@server "cat > backup.tar.gz"
Упаковать и отправить по SSH без промежуточного файла.
Копирование — rsync, scp
Косая черта в конце источника значит «содержимое каталога», без неё — «сам каталог».
rsync -avh --progress ./ user@server:/target/
Синхронизировать содержимое каталога с прогрессом.
rsync -avhn --delete ./ /backup/
Пробный прогон (-n): показать, что будет сделано, и ничего не делать.
rsync -avh --delete ./ /backup/
Зеркало: лишнее в приёмнике удаляется.
rsync -avh --exclude="node_modules" --exclude=".git" ./ /backup/
Синхронизация без тяжёлых каталогов.
rsync -avz -e "ssh -p 2222 -i ~/.ssh/key" ./ user@server:/target/
Свой порт и ключ SSH.
rsync -avh --partial --append-verify big.iso user@server:/target/
Докачать прерванный перенос большого файла.
scp -r . user@server:/target/
Разовое копирование каталога по SSH.
scp user@server:/remote/file.log .
Забрать файл с сервера себе.
Процессы и нагрузка
ps aux --sort=-%mem | head
Топ процессов по памяти; -%cpu — по процессору.
pgrep -af node
Найти процессы по имени вместе с командной строкой.
pkill -f "node server.js"
Убить по совпадению всей команды, а не только имени.
kill -TERM 1234
Вежливая просьба завершиться; -KILL — если не слышит.
top -o %MEM
Живой список процессов, отсортированный по памяти.
htop
То же удобнее: дерево, фильтр, убийство по F9.
uptime
Средняя нагрузка за 1, 5 и 15 минут.
lsof -i :3000
Кто занял порт.
lsof -p 1234
Какие файлы держит процесс.
nohup command > out.log 2>&1 &
Запустить в фоне так, чтобы пережило выход из сессии.
strace -p 1234 -f -e trace=openat
Подсмотреть системные вызовы живого процесса.
Диск и файловая система
df -h
Свободное место по разделам.
df -i
Свободные inode: место есть, а файл не создаётся — обычно это.
du -sh .
Размер каталога одной строкой.
du -h --max-depth=1 . | sort -h
Куда делось место: размеры вложенных каталогов по возрастанию.
ncdu .
Интерактивный обход по размерам.
lsblk -f
Диски, разделы, файловые системы и точки монтирования.
mount | column -t
Что и куда смонтировано.
stat file.txt
Размер, права, владелец и три времени: доступ, изменение, смена метаданных.
file file.txt
Что это за файл на самом деле, по содержимому, а не по расширению.
truncate -s 0 file.txt
Очистить растущий лог, не трогая дескриптор открывшего его процесса.
Права и владельцы
chmod 644 file.txt
Владельцу чтение и запись, остальным чтение.
chmod 755 .
Каталогу нужен x, иначе в него нельзя войти.
chmod -R u+rwX,go+rX,go-w .
Заглавная X ставит x только каталогам и уже исполняемым файлам.
chown -R www-data:www-data .
Сменить владельца и группу рекурсивно.
chmod g+s .
setgid на каталог: новые файлы наследуют группу.
umask 022
Маска прав по умолчанию для новых файлов текущей сессии.
sudo -u www-data -H bash -c "cmd"
Выполнить команду от другого пользователя с его HOME.
getfacl file.txt
Расширенные права ACL, когда обычных ugo не хватает.
Сеть с сервера
ss -tulpn
Открытые порты и процессы за ними — замена netstat.
ip a
Адреса интерфейсов; ip r — таблица маршрутов.
curl -I https://example.com
Только заголовки ответа.
curl -sS -o /dev/null -w "%{http_code} %{time_total}\n" https://example.com
Код ответа и время без тела.
dig +short example.com A
Быстрый DNS-запрос; @8.8.8.8 — через конкретный резолвер.
traceroute example.com
Где теряется путь до хоста; mtr — то же в динамике.
nc -zv server 443
Проверить, открыт ли порт.
tcpdump -i any -n port 443 -c 20
Двадцать пакетов по порту 443 без резолва имён.
ssh -L 5432:localhost:5432 user@server
Пробросить удалённый порт к себе на локальный.
systemd и журналы
systemctl status nginx
Состояние службы и последние строки её лога.
systemctl restart nginx
Перезапуск; reload — перечитать конфиг без разрыва соединений.
systemctl enable --now nginx
Включить автозапуск и сразу стартовать.
systemctl list-units --type=service --state=running
Что сейчас работает.
systemctl list-timers
Таймеры systemd — замена cron; когда следующий запуск.
systemctl daemon-reload
Перечитать unit-файлы после правки.
journalctl -u nginx -f
Живой лог службы.
journalctl -u nginx --since "1 hour ago" --no-pager
Лог за час одним куском.
journalctl -p err -b
Только ошибки с момента текущей загрузки.
journalctl --disk-usage && journalctl --vacuum-time=7d
Сколько занимает журнал и как обрезать его до недели.
systemd-analyze blame
Что дольше всех тормозит загрузку.
Мелочи, которые экономят минуты
tail -f file.txt | grep --line-buffered ERROR
Живой лог с фильтром: без --line-buffered grep копит вывод в буфере.
watch -n 2 "df -h /"
Повторять команду каждые две секунды.
sort file.txt | uniq -c | sort -rn | head
Топ повторяющихся строк.
cut -d, -f1,3 file.txt
Взять колонки из CSV без awk.
column -t -s, file.txt
Выровнять CSV в читаемую таблицу.
xargs -P 4 -n 1 command < list.txt
Выполнить команду для каждой строки в четыре потока.
tee file.txt | grep ERROR
И записать в файл, и передать дальше по конвейеру.
!!
Повторить предыдущую команду; sudo !! — её же от root.
cd -
Вернуться в предыдущий каталог.
history | grep rsync
Найти команду, которую точно уже набирали.
ln -s /real/path file.txt
Символическая ссылка; -f перезапишет существующую.
date -u +"%Y-%m-%dT%H:%M:%SZ"
Метка времени в UTC по ISO 8601.