Перейти к содержанию

linux

grep

  • grep 'first\|second\|third' file — grep по нескольким значениям. Значения разделяются экранированной прямой чертой \|:
  • grep -o pattern file.log — показывать только подходящую часть строки, а не всю целиком
  • grep -v pattern file.log — инверсия матчинга. То есть искать то, что не подходит под шаблон
  • использовать регулярки для поиска
    # использование extended regular expressions
    grep -E regexp file.log
    
    # использование Perl-compatible regular expressions
    grep -P 'time_total":.*?,' check.log
    

find

  • вывести список всех типов файлов, присутствующих в каталоге
    # с помощью awk выдираем расширение
    find /path/to/dir -type f | awk -F. '{print $NF}' | sort | uniq -c
    
  • найти и удалить файлы по расширению
    find /path/to/dir -type f -name "*.pdf" -delete
    
  • найти с использованием regex
    find /path/to/dir -type f -regex '.*\.\(docx?\|zip\)$'
    # регистронезависимый вариант regex
    find /path/to/dir -type f -iregex '.*\.\(docx?\|zip\)$'
    
  • find + grep: поиск фразы в файлах, лежащих внтури lang, из поиска исключить некоторые директории
    find . -type f \
      -path '*/lang/*'  \
      -not -path '*/bitrix/components/bitrix/*' \
      -not -path '*/bitrix/modules/main/*' \
      -exec grep -l 'Главная\|Карта офиса' {} \; -print | uniq
    
  • поиск по размеру
    # поиск файлов по размеру больше 1G
    find . -type f -size +1G
    find . -type f -size +1G -exec ls -lh {} \;
    
  • поиск по нескольким именам
    find . -type d -name first -o -name second
    find . -type d \( -name 'first' -o -name 'second' \) -print
    

du

# просмотр размера папки catalog
du -sh catalog

#просмотр размеров каталогов в текущей папке
du -sh *

# просмотр размеров каталогов в текущей папке c игнором каталога
du -sh --exclude=some_dir *

# сортировка по размеру от больших к меньшим
du -sh * | sort -rh 

tar

  • tar -xzf file.tar.gz --strip-components=1 — пропустить верхний каталог при извлечении

bash

  • sudo !! — повторение предыдущей команды от sudo
  • Очистка файла через sudo -u
    echo '' | sudo -u www-data tee file.log
    
    # через truncate
    sudo -u www-data truncate -s 0 file.log
    
  • Создание функции-обёртки для вызова команды
    ~/.bashrc
    # работа с composer, установленным в докере
    dcomposer () {
        docker compose -f /opt/my-site/docker-compose.yml exec -i php-fpm composer "$@"
    }
    
    ugit () {
        sudo -u www-data git "$@"
    }
    # completion (автодополнение) для ugit как для git
    source /usr/share/bash-completion/completions/git
    __git_complete ugit __git_main
    
  • массивы, ${values[*]}, ${values[@]}
    files=("file1" "file2" "file3")
    
    # всё в одну строку
    rm "${files[*]}"
    # при вызове превратится в такое
    rm "file1 file2 file3"
    
    # каждый элемент массива передаётся как отдельный аргумент
    rm "${files[@]}"
    # при вызове превратится в такое
    rm "file1" "file2" "file3"
    

install

Для создания каталогов можно использовать команду install с параметром -d. Она позволяет указать владельца и группу для создаваемых каталогов.

# создание каталога
sudo install  -d my-site  -o www-data  -g www-data

# создание пустого файла
sudo install  -m 600  -o www-data  -g www-data  /dev/null  empty-file.txt

ssh

Сперва необходимо сгенерировать ключ. Потом публичную часть ключа необходимо скопировать на удалённый сервер. Для копирования публичной части ключа удобно использовать утилиту ssh-copy-id. Для удобства все команды запускаются внутри ~/.ssh.

ssh-keygen -t ed25519 -C 'Какой-то коментарий для ключа'
ssh-copy-id -i identity_key -p port user@ip

Проброс портов

Есть ssh доступ к машине, находящейся за vpn. Есть сайт/сервис внутри vpn, который недоступен для текущей машины, но доступен для машины, для которой есть ssh доступ. Можно использовать ssh туннелирование для доступа к закрытым ресурсам:

ssh -L localport:host:hostport  user@ip

Либо через настройки ssh_config (тут параметры разделены пробелом)

~/.ssh/config
Host remote
  HostName ip
  User user
  LocalForward  localport  host:hostport

Получить доступ к сайту some-site.inner, работающему по http, используя имеющийся ssh доступ к машине @ip

ssh -L 8080:some-site.inner:80  user@ip
Теперь при открытии в браузере http://localhost:8080 откроется some-site.inner

Аналогично для https:

ssh -L 8043:some-site.inner:443  user@ip
При открытии в браузере https://localhost:8043 откроется some-site.inner. Браузер выдаст ошибку сертификата, необходимо согласиться продолжать работу.

less

Команды

С помощью + можно указать, какие команды выполнить после открытия. Например, команда G открывает файл с конца.

  • less +G file.log — открыть файл с конца
  • R (shift + r) — перечитать и перерисовать файл
  • F — следить за изменением файла

Опции

Опции передаются через -S при вызове, либо нажатие -S в программе. Некоторые опции могут быть указаны только при запуске:

  • -N отображать номера строк при запуске (на больших файлах сильно замедлит запуск)
  • -S переключить перенос строк
  • -X при отрисовке не очищать экран, а вставить ниже. Например, если содержимое файла небольшое, то less запустится сразу после prompt вместо очистки всего экрана. Удобно при использовании например для git log
  • -F автоматически закрыть less если содержимое занимает меньше одного экрана. При установленном параметре S и слишком длинной строке не сработает — считается что содержимое не влезло в экран
  • -x указать длину таба (Tab stop)

sudo

  • Запуск sudo git без запроса пароля:
    username ALL=(ALL) NOPASSWD: /usr/bin/git
    
  • Запуск git от имени www-data без запроса пароля: sudo -u www-data git status:
    username ALL=(www-data) NOPASSWD: /usr/bin/git
    
  • Подключение доп файлов в основном конфиге (символ # обязательный)
    #includedir /etc/sudoers.d
    
  • Открытие нестандартного файла конфигурации
    sudo visudo -f /etc/sudoers.d/custom_config
    
  • Открытие sudo vim, при этом vim использует конфиги текущего пользователя:
    # параметр -E позволяет сохранять переменные среды
    sudo -E vim /file
    
    sudo EDITOR=vim crontab -e
    

systemd

  • Запуск одноразовых задач в фоне
# запуск долгой выгрузки в фоне. php работает в docker контейнере
systemd-run \
    --unit=php-export-job \
    --no-block \
    --property=Type=oneshot \
    docker exec --user www-data php-fpm php -f /var/www/scripts/run.php

# проверка статуса
systemd-run status php-export-job

Локали

Проверить настройки категории локали, отвечающей за формат числа

locale -k LC_NUMERIC

Обновить категорию локали глобально. Для применения необходимо перезайти

sudo update-locale LC_NUMERIC=en_US.UTF-8

Часовые пояса

  • timedatectl — проверить установленную дату и часовой пояс
  • sudo timedatectl list-timezones — список часовых поясов
  • sudo timedatectl set-timezone Europe/Moscow — установить часовой пояс
  • timedatectl timesync-status, timedatectl status