os:linux:utils
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| os:linux:utils [19.08.2024 07:49] – [logrotate] viacheslav | os:linux:utils [04.09.2025 21:29] (текущий) – [test] viacheslav | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ===== apt ===== | ||
| + | ==== Работа через прокси-сервер ==== | ||
| + | <file bash / | ||
| + | Acquire:: | ||
| + | Acquire:: | ||
| + | Acquire:: | ||
| + | </ | ||
| + | <file bash / | ||
| + | http_proxy=" | ||
| + | https_proxy=" | ||
| + | ftp_proxy=" | ||
| + | </ | ||
| + | |||
| + | ==== Отключить новости в apt ==== | ||
| + | <code bash> | ||
| + | # News about significant security updates, features and services will | ||
| + | # appear here to raise awareness and perhaps tease /r/Linux ;) | ||
| + | # Use 'pro config set apt_news=false' | ||
| + | |||
| + | pro config set apt_news=false | ||
| + | </ | ||
| + | |||
| + | ==== Список пакетов, | ||
| + | <code bash> | ||
| + | apt list --manual-installed=true | ||
| + | </ | ||
| + | |||
| + | ==== Информация о пакете в репозитории (ещё не установленном в системе) ==== | ||
| + | <code bash> | ||
| + | apt-cache show PACKAGE_NAME | ||
| + | </ | ||
| + | |||
| + | ==== Убрать запрос на перезапуск сервисов во время обновления ==== | ||
| + | <code bash> | ||
| + | export DEBIAN_FRONTEND=noninteractive | ||
| + | apt upgrade -y | ||
| + | </ | ||
| + | На уровне системы: | ||
| + | <file bash / | ||
| + | # Restart mode: (l)ist only, (i)nteractive or (a)utomatically. | ||
| + | # | ||
| + | # ATTENTION: If needrestart is configured to run in interactive mode but is run | ||
| + | # non-interactive (i.e. unattended-upgrades) it will fallback to list only mode. | ||
| + | # | ||
| + | # | ||
| + | </ | ||
| + | <code bash> | ||
| + | sed -i '/# | ||
| + | </ | ||
| + | |||
| + | ==== The following packages have been kept back ==== | ||
| + | После '' | ||
| + | < | ||
| + | The following packages have been kept back: | ||
| + | gimp gimp-data libgegl-0.0-0 libgimp2.0 | ||
| + | </ | ||
| + | Исправить можно несколькими способами: | ||
| + | <code bash> | ||
| + | # 1. Не помечает пакеты как установленные вручную, | ||
| + | sudo apt-get --with-new-pkgs upgrade <list of packages kept back> | ||
| + | # 2. В большинстве случаев это даёт пакетам всё, что нужно для дальнейшего обновления | ||
| + | sudo apt-get install <list of packages kept back> | ||
| + | # 3. Агрессивный вариант, | ||
| + | apt dist-upgrade | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | ==== Отвечать на вопрос о замене конфигов по умолчанию (N) при обновлении ==== | ||
| + | Избавиться от вопросов типа | ||
| + | <code bash> | ||
| + | 10.190.113.11 Configuration file '/ | ||
| + | 10.190.113.11 | ||
| + | 10.190.113.11 | ||
| + | 10.190.113.11 | ||
| + | 10.190.113.11 | ||
| + | 10.190.113.11 | ||
| + | 10.190.113.11 | ||
| + | 10.190.113.11 | ||
| + | 10.190.113.11 | ||
| + | 10.190.113.11 *** nscd.conf (Y/ | ||
| + | </ | ||
| + | |||
| + | Вариант 1 | ||
| + | <code bash> | ||
| + | apt-get update | ||
| + | apt-get -y -o Dpkg:: | ||
| + | apt-get -y -o Dpkg:: | ||
| + | |||
| + | # --force-confold: | ||
| + | # With this option alone, even configuration files that you have not modified are left untouched. | ||
| + | # You need to combine it with --force-confdef to let dpkg overwrite configuration files that you have not modified. | ||
| + | # --force-confnew: | ||
| + | # --force-confdef: | ||
| + | # --force-confmiss: | ||
| + | </ | ||
| + | |||
| + | Вариант 2 | ||
| + | <code bash> | ||
| + | DEBIAN_FRONTEND=noninteractive apt-get upgrade | ||
| + | </ | ||
| + | |||
| + | https:// | ||
| + | |||
| + | ==== Ubuntu Pro / ESM ==== | ||
| + | Отключить уведомления типа | ||
| + | < | ||
| + | Get more security updates through Ubuntu Pro with ' | ||
| + | vlc-plugin-qt libvlc5 vlc-data libvlccore9 vlc imagemagick vlc-bin vlc-l10n | ||
| + | libopenexr25 libpostproc55 libmagickcore-6.q16-6-extra vlc-plugin-samba | ||
| + | ... | ||
| + | Learn more about Ubuntu Pro at https:// | ||
| + | </ | ||
| + | при '' | ||
| + | |||
| + | Третий способ. | ||
| + | <code bash> | ||
| + | # One option is to create a symbolic link for 20apt-esm-hook.conf to /dev/null: | ||
| + | sudo ln -s -f /dev/null / | ||
| + | # Another option is to just comment out the action lines in that file: | ||
| + | sudo sed -i'' | ||
| + | # Or a third option is to just rename that file to a .bak file, and create a zero length file of the same name: | ||
| + | sudo mv / | ||
| + | sudo touch / | ||
| + | </ | ||
| + | https:// | ||
| + | ===== awk ===== | ||
| + | mawk - pattern scanning and text processing language | ||
| + | <code bash> | ||
| + | awk '/ | ||
| + | awk '/ | ||
| + | awk '/ | ||
| + | awk ' | ||
| + | awk ' | ||
| + | awk ' | ||
| + | awk -F ':' | ||
| + | |||
| + | cat permissions | ||
| + | File1 | ||
| + | Dir1 Grp2 Modify | ||
| + | File3 | ||
| + | Dir3 Grp1 Read 4000 | ||
| + | Dir3 Grp3 Modify | ||
| + | File1 | ||
| + | |||
| + | # Блок BEGIN - действия до обработки данных, | ||
| + | # Вывести " | ||
| + | awk 'BEGIN {print " | ||
| + | Starting script | ||
| + | People with modify permissions: | ||
| + | |||
| + | # Изначально i=0, если i< | ||
| + | # Когда будут обработаны все строки файла permissions, | ||
| + | awk ' | ||
| + | # 3000*4=12000 | ||
| + | # 12000+2000*4=20000 | ||
| + | # 20000+1000*4=24000 | ||
| + | # 24000+4000*4=40000 | ||
| + | # 40000+6000*4=64000 | ||
| + | # 64000+10000*4=104000 | ||
| + | 104000 | ||
| + | |||
| + | # Если 2-я колонка match [Uu]ser, а значение последней меньше 2000, то вывести строку | ||
| + | awk '$2 ~/[Uu]ser/ {if($NF> | ||
| + | User User1 has 3000 number which more than 2000 | ||
| + | User User4 has 10000 number which more than 2000 | ||
| + | |||
| + | </ | ||
| + | https:// | ||
| + | ===== curl ===== | ||
| + | <code bash> | ||
| + | # Вывести информацию о файле | ||
| + | curl -I " | ||
| + | HTTP/1.1 200 OK | ||
| + | Server: nginx | ||
| + | Date: Thu, 12 May 2022 14:00:33 GMT | ||
| + | Content-Type: | ||
| + | Content-Length: | ||
| + | Last-Modified: | ||
| + | Connection: keep-alive | ||
| + | ETag: " | ||
| + | Accept-Ranges: | ||
| + | |||
| + | # Сохранить с именем из URL (1Mb.dat) | ||
| + | curl " | ||
| + | |||
| + | # Проверка на наличие текста в URL (вариант IF-THEN) | ||
| + | curl -s google.com |fgrep -ci "301 moved" > /dev/null && echo " | ||
| + | |||
| + | # HTTP status code | ||
| + | http_code=$(curl -kIso /dev/null -w " | ||
| + | </ | ||
| + | |||
| + | ===== date ===== | ||
| + | <code bash> | ||
| + | # Последнее воскресенье месяца | ||
| + | if [[ $(date -d "$date + 1week" +%d%a) =~ 0[1-7]Sun ]] | ||
| + | then | ||
| + | echo "$date is the last Sunday of the month!" | ||
| + | fi | ||
| + | |||
| + | date -d yesterday +'%b %d' # Вчера (мая 25) | ||
| + | date -d yesterday +%F # 2022-04-25 | ||
| + | date -r file1 # дата изменения файла | ||
| + | date -u # время в UTC | ||
| + | date +%T -s " | ||
| + | date -s "15 aug 2022 14: | ||
| + | date -d@$(echo $SECONDS) -u +%T # время работы сессии bash - конвертировать из секунд в hh:mm:ss | ||
| + | # Время работы сессии bash полезно для подсчёта времени работы скрипта (конец - начало = время работы) | ||
| + | |||
| + | # Форматирование даты | ||
| + | %F - yy-MM-dd (2022-05-26) | ||
| + | %D – Display date as mm/dd/yy | ||
| + | %Y – Year (e.g., 2020) | ||
| + | %m – Month (01-12) | ||
| + | %B – Long month name (e.g., November) | ||
| + | %b – Short month name (e.g., Nov) | ||
| + | %d – Day of month (e.g., 01) | ||
| + | %j – Day of year (001-366) | ||
| + | %u – Day of week (1-7) | ||
| + | %A – Full weekday name (e.g., Friday) | ||
| + | %a – Short weekday name (e.g., Fri) | ||
| + | %T - Время в формате 10:20:30 | ||
| + | %H – Hour (00-23) | ||
| + | %I – Hour (01-12) | ||
| + | %M – Minute (00-59) | ||
| + | %S – Second (00-60) | ||
| + | </ | ||
| + | https:// | ||
| + | https:// | ||
| + | ===== dd ===== | ||
| + | <WRAP round info 70%> | ||
| + | Лучше вообще не использовать dd, а подобрать что-то посовременнее | ||
| + | </ | ||
| + | <code bash> | ||
| + | # Сделана копия диска | ||
| + | dd if=/dev/sda conv=sync, | ||
| + | # При восстановлении на больший диск он заполняется полностью и пишет, что нет места | ||
| + | zcat / | ||
| + | </ | ||
| + | [[https:// | ||
| + | > conv=sync will pad a short read to a full block. Don't do it when reading from a compressed stream. | ||
| + | Упоминается использование iflag=fullblock. Т. е., | ||
| + | <code bash> | ||
| + | zcat / | ||
| + | # или | ||
| + | zcat / | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | ===== df ===== | ||
| + | Показывает объём свободного места на диске. | ||
| + | <code bash> | ||
| + | # в человекочитаемых единицах | ||
| + | df -h | ||
| + | Filesystem | ||
| + | / | ||
| + | # Показать inode | ||
| + | df -i | ||
| + | </ | ||
| + | |||
| + | В файловых системах **ext[234]** кол-во inode фиксированное, | ||
| + | |||
| + | |||
| + | ===== diff ===== | ||
| + | diff - compare files line by line | ||
| + | <code bash> | ||
| + | diff file1 file2 # В каждом 3 строки, | ||
| + | 3c3 | ||
| + | < line3 | ||
| + | --- | ||
| + | > line4 | ||
| + | </ | ||
| + | |||
| + | ===== du ===== | ||
| + | **d**isk **u**sage. Показывает размер файлов и каталогов. | ||
| + | <code bash> | ||
| + | # Общий размер каталога (-s) в удобных единицах (-h) | ||
| + | du -sh ~/folder | ||
| + | # -d - глубина, | ||
| + | du -hd 1 /var/log |sort -rh | ||
| + | 59M / | ||
| + | 57M / | ||
| + | 932K / | ||
| + | 116K / | ||
| + | 72K / | ||
| + | 4.0K / | ||
| + | 4.0K / | ||
| + | 4.0K / | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | Отфильтровать строки с '' | ||
| + | <code bash> | ||
| + | du -hd 1 / 2> >(grep -v ' | ||
| + | du -cBM --max-depth=1 2> >(grep -v ' | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | Вариант с псевдографикой - '' | ||
| + | ===== find ===== | ||
| + | <code bash> | ||
| + | find /etc -name ' | ||
| + | find /etc -type f -name ' | ||
| + | find . -perm 777 # найти в текущем каталоге файлы с правами доступа 777 | ||
| + | find . -perm 777 -exec chmod 555 {} \; # изменить им разрешения на 555 | ||
| + | find / -mtime +1 # найти файлы с датой изменения старше суток | ||
| + | find / -atime +1 # найти файлы с датой доступа старше суток | ||
| + | find / -group www-data # файлы с владельцем-группой | ||
| + | find / -size 1MB # найти файлы размером 1 МБ | ||
| + | find /var/www -name *bxu* -exec rm -rf {} + | ||
| + | # Найти файлы .txt и .log, варианты (опция -o - это оператор OR) | ||
| + | find . -regex ' | ||
| + | find . -name ' | ||
| + | # Отключить ошибки, | ||
| + | find / -name ' | ||
| + | # Удалить файлы business-* старше 14 дней в каталогах business-* | ||
| + | find "/ | ||
| + | # Создать подкаталог old, заархивировать файлы (нерекурсивно) старше вчерашнего дня, удалить оригиналы, | ||
| + | mkdir -p / | ||
| + | find / | ||
| + | xargs tar czf / | ||
| + | find / | ||
| + | </ | ||
| + | The command termination '' | ||
| + | |||
| + | ===== grep ===== | ||
| + | <code bash> | ||
| + | grep ^hello file1 # обычный grep понимает регулярки | ||
| + | grep [1-9] file1 # найти цифры с 1 по 9 | ||
| + | grep [a-f] file1 # буквы с a до f | ||
| + | grep -f expression1 file1 # взять запрос из файла expression1 | ||
| + | grep -lr cron /etc # вывести имена файлов, | ||
| + | tail -f / | ||
| + | grep -Rnw '/ | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | ===== gzip ===== | ||
| + | pigz - многопоточный gzip. Умеет также работать с zip и zlib (.zz). | ||
| + | <code bash> | ||
| + | # Не удалять оригинал, | ||
| + | pigz -k -9 -p4 archlinux.iso | ||
| + | # Показать содержимое архива | ||
| + | pigz -l archlinux.iso.gz | ||
| + | # Сжать в zip | ||
| + | pigz -k -K archlinux.iso | ||
| + | # Сжатие каталогов, | ||
| + | tar cf - Pictures/ | pigz > pictures.tar.gz | ||
| + | tar -I pigz -cf yourfile.tar.gz folder1 folder2 | ||
| + | # Распаковать | ||
| + | pigz -d archlinux.iso.gz | ||
| + | </ | ||
| + | https:// | ||
| + | ===== hdparm ===== | ||
| + | hdparm - get/set hard disk parameters | ||
| + | |||
| + | Можно померить скорость чтения | ||
| + | <code bash> | ||
| + | sudo hdparm -t --direct /dev/sda1 | ||
| + | |||
| + | /dev/sda1: | ||
| + | | ||
| + | </ | ||
| + | |||
| + | ===== kill ===== | ||
| + | '' | ||
| + | |||
| + | ===== logrotate ===== | ||
| + | <code bash> | ||
| + | # Посмотреть настройки для определённого лога | ||
| + | cat / | ||
| + | # Тест настроек | ||
| + | logrotate -d / | ||
| + | # Примерная строка для crontab, чтобы запустить logrotate | ||
| + | 0 */2 * * * logrotate -f / | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | <code bash> | ||
| + | / | ||
| + | size 2 | ||
| + | rotate 84 | ||
| + | compress | ||
| + | missingok | ||
| + | copytruncate | ||
| + | } | ||
| + | </ | ||
| + | The '' | ||
| + | |||
| + | https:// | ||
| + | |||
| + | :!: Параметры вне каталогов глобальны и применяются к logrotate в целом, а не только к файлу, где они указаны!\\ | ||
| + | Поэтому повторяющиеся параметры нужно писать в каждом каталоге. | ||
| + | <code bash> | ||
| + | / | ||
| + | { | ||
| + | su admin admin # Выполнять от юзера и группы admin | ||
| + | daily # архивировать каждый день | ||
| + | rotate -1 # не удалять архивы | ||
| + | olddir old # Помещать архивы в подкаталог old каталога, | ||
| + | createolddir # если каталога olddir нет - создать | ||
| + | compress # сжимать | ||
| + | missingok # если лога нет - ничего страшного | ||
| + | |||
| + | copytruncate # Не удалять файл, а обнулить его, архивируя содержимое (чтобы процесс мог писать в него дальше) | ||
| + | dateext # Помечать архив датой | ||
| + | dateformat .%Y-%m-%d-%s # Формат даты, тут будет нечто вроде file-2024-08-08-1234567.1.log.gz | ||
| + | maxsize 1G # Архивировать чаще, чем daily, если лог достиг 1 ГБ | ||
| + | } | ||
| + | |||
| + | / | ||
| + | / | ||
| + | { | ||
| + | su admin admin | ||
| + | daily | ||
| + | rotate -1 | ||
| + | olddir old | ||
| + | createolddir | ||
| + | compress | ||
| + | missingok | ||
| + | minage 1 # Не архивировать логи новее 1 дня (там дата в названии) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Стандартный конфиг для tomcat9: | ||
| + | <file bash / | ||
| + | / | ||
| + | copytruncate | ||
| + | weekly | ||
| + | rotate 52 | ||
| + | compress | ||
| + | delaycompress | ||
| + | missingok | ||
| + | create 640 tomcat adm | ||
| + | su tomcat adm | ||
| + | } | ||
| + | </ | ||
| + | ===== ls ===== | ||
| + | Вывод информации о файлах. | ||
| + | <code bash> | ||
| + | ls -l # в виде списка | ||
| + | </ | ||
| + | Типы файлов в списке (1-й символ): | ||
| + | * - Обычный файл | ||
| + | * d Каталог | ||
| + | * l Символическая cсылка | ||
| + | * b Файл блочного устройства | ||
| + | * c Файл символьного устройства | ||
| + | * p Именованные каналы | ||
| + | * s Сокет | ||
| + | * n Сетевой файл | ||
| + | |||
| + | ===== lsblk ===== | ||
| + | Показывает блочные устройства | ||
| + | <code bash> | ||
| + | lsblk | ||
| + | |||
| + | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT | ||
| + | loop0 | ||
| + | loop1 | ||
| + | loop2 | ||
| + | loop3 | ||
| + | loop4 | ||
| + | loop5 | ||
| + | loop6 | ||
| + | loop7 | ||
| + | sda | ||
| + | ├─sda1 | ||
| + | ├─sda2 | ||
| + | └─sda3 | ||
| + | └─ubuntu--vg-ubuntu--lv 253:0 0 57.5G 0 lvm / | ||
| + | sr0 11:0 1 1024M 0 rom | ||
| + | </ | ||
| + | |||
| + | ===== lsof ===== | ||
| + | Вывод списка открытых файлов, | ||
| + | <code bash> | ||
| + | COMMAND | ||
| + | systemd | ||
| + | systemd | ||
| + | systemd | ||
| + | systemd | ||
| + | </ | ||
| + | - COMMAND - процесс\\ | ||
| + | - PID - идентификатор процесса\\ | ||
| + | - USER - пользователь | ||
| + | - FD - дескриптор файла | ||
| + | - cwd — рабочий каталог | ||
| + | - rtd — каталог /root | ||
| + | - txt — исполняемый файл | ||
| + | - mem — область памяти | ||
| + | - число — номер дескриптора файла, используемого процессом | ||
| + | - u — файл открыт с правами RW | ||
| + | - r — файл открыт с правами R | ||
| + | - w — файл открыт с правами W с частичной блокировкой файла | ||
| + | - W — файл открыт с правами W с блокировкой всего файла | ||
| + | - TYPE — тип файла | ||
| + | - REG — файл | ||
| + | - DIR — каталог | ||
| + | - FIFO — именованные каналы | ||
| + | - DEVICE — номер устройства, | ||
| + | - SIZE/OFF — размер | ||
| + | - NODE — номер inode, индексного дескриптора | ||
| + | - NAME — имя файла | ||
| + | <code bash> | ||
| + | # Процессы, | ||
| + | lsof +D /tmp/test | ||
| + | COMMAND | ||
| + | vi 4570 root 3u | ||
| + | # Информация о процессе | ||
| + | lsof -p 4570 | ||
| + | </ | ||
| + | Если файл ''/ | ||
| + | <code bash> | ||
| + | # Вывести удалённые файлы, занимающие память из-за того, что процесс не отпустил дескрипторы | ||
| + | lsof -a +L1 /tmp/test | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | ===== netstat ===== | ||
| + | Статистика по стеевым подключениям. | ||
| + | <code bash> | ||
| + | netstat -nap |grep ssh | ||
| + | </ | ||
| + | http:// | ||
| + | ===== printf ===== | ||
| + | printf - format and print data | ||
| + | <code bash> | ||
| + | printf " | ||
| + | Name: User | ||
| + | ID: 0067 | ||
| + | |||
| + | today=$(date +%F) | ||
| + | time=$(date +%T) | ||
| + | printf -v d " | ||
| + | echo " | ||
| + | Current user: user | ||
| + | Date: | ||
| + | </ | ||
| + | |||
| + | ===== ps ===== | ||
| + | Список процессов. | ||
| + | <code bash> | ||
| + | ps aux | grep java | ||
| + | </ | ||
| + | |||
| + | ===== read ===== | ||
| + | Read a line from the standard input and split it into fields. | ||
| + | <code bash> | ||
| + | read -r < log.txt # Читает первую строку из файла | ||
| + | echo " | ||
| + | Jun 5 00:00:29 srv-mail1 postfix/ | ||
| + | read -r month day time server id message | ||
| + | echo " | ||
| + | disconnect from unknown[192.168.5.3] ehlo=1 auth=0/1 rset=1 quit=1 commands=3/ | ||
| + | echo " | ||
| + | srv-mail1 | ||
| + | |||
| + | # Разделить строку на 2 части | ||
| + | $ i=" | ||
| + | $ read -r tag description <<< | ||
| + | $ echo $tag | ||
| + | v2.2.187 | ||
| + | $ echo $description | ||
| + | 3826893 Very important commit, absolutely brilliant | ||
| + | </ | ||
| + | [[https:// | ||
| + | ===== rm ===== | ||
| + | remove files or directories | ||
| + | <code bash> | ||
| + | # Удалить всё, в т. ч. файлы с точками в начале имени | ||
| + | rm -rf -- ..?* .[!.]* * | ||
| + | </ | ||
| + | |||
| + | ===== rsync ===== | ||
| + | <code bash> | ||
| + | # копировать содержимое /www с 10.1.0.9 на локальный сервер, | ||
| + | rsync --info=progress2 --recursive --exclude=' | ||
| + | # если без звёздочки (или без /), то будет скопирован сам каталог conf.d как подпапка | ||
| + | rsync --info=progress2 --recursive user@10.1.0.9:/ | ||
| + | |||
| + | # -a - " | ||
| + | # -c - считать контрольные суммы. Большие файлы бьются на куски, и суммы считаются для кусков. | ||
| + | # -P - прогресс | ||
| + | rsync -a -c -P < | ||
| + | |||
| + | # --ignore-existing - если имя файла есть в < | ||
| + | # -u - " | ||
| + | rsync -a -P -u --ignore-existing < | ||
| + | </ | ||
| + | https:// | ||
| + | https:// | ||
| + | https:// | ||
| + | |||
| + | ===== scp ===== | ||
| + | Копирование файлов через ssh. | ||
| + | <code powershell> | ||
| + | $sshPrivKey = " | ||
| + | # Каталог cka создастся в каталоге Backup, копировать рекурсивно (-r), сохранять даты файлов (-p) | ||
| + | & scp.exe -rpi $sshPrivKey user@k3: | ||
| + | </ | ||
| + | [[https:// | ||
| + | ===== sed ===== | ||
| + | <code bash> | ||
| + | # Заменить test на another test | ||
| + | echo "This is a test" | sed ' | ||
| + | # Заменить в файле (файл не перезаписывается) | ||
| + | sed ' | ||
| + | # Ключ -e - несколько действий | ||
| + | sed -e ' | ||
| + | # Ключ -f - чтение команд из файла. Содержимое файла mycommands: | ||
| + | s/ | ||
| + | s/ | ||
| + | # команда: | ||
| + | sed -f mycommands myfile | ||
| + | |||
| + | # Флаги, пишутся в конце команды (s/ | ||
| + | # g - заменить все совпадения, | ||
| + | # p - вывести исходную строку, | ||
| + | sed ' | ||
| + | sed ' | ||
| + | sed -n ' | ||
| + | sed ' | ||
| + | |||
| + | # Можно заменить разделитель для более удобного чтения | ||
| + | sed ' | ||
| + | sed ' | ||
| + | |||
| + | # Фильтр, | ||
| + | sed ' | ||
| + | # с 10 до конца (можно использовать регулярку) | ||
| + | sed ' | ||
| + | # заменить только в строке, | ||
| + | sed '/ | ||
| + | |||
| + | # удалить 3-ю строку | ||
| + | sed ' | ||
| + | # удалить с 10 по 20 | ||
| + | sed ' | ||
| + | # с 10 до конца | ||
| + | sed ' | ||
| + | # удаление строк по шаблону | ||
| + | sed '/ | ||
| + | # При удалении можно указывать несколько шаблонов. | ||
| + | # удалятся строки, | ||
| + | sed '/ | ||
| + | |||
| + | # вставка текста до | ||
| + | echo " | ||
| + | # вставка текста после | ||
| + | echo " | ||
| + | # перед 2-й строкой | ||
| + | sed ' | ||
| + | |||
| + | # заменить целиком всю 3-ю строку | ||
| + | sed ' | ||
| + | # заменить целиком все строки, | ||
| + | sed '/This is/c This is a changed line of text.' myfile | ||
| + | |||
| + | # замена отдельных символов на соответствующие (1 на 5 и т. д.) | ||
| + | # применяется ко всему потоку, | ||
| + | sed ' | ||
| + | |||
| + | # вывести строки с их номерами | ||
| + | sed ' | ||
| + | # вывести номера строк, соответствующих шаблону | ||
| + | sed -n '/ | ||
| + | |||
| + | # вставить содержимое newfile после 3-й строки myfile | ||
| + | sed '3r newfile' | ||
| + | # вставлять содержимое newfile каждый раз после строки, | ||
| + | sed '/ | ||
| + | |||
| + | # Заменить строки в myfile, где есть DATA, на содержимое newfile, удалить исходную строку | ||
| + | sed '/ | ||
| + | r newfile | ||
| + | d}' myfile | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | <code bash> | ||
| + | # Заменить foo на too. | ||
| + | sed -i ' | ||
| + | # Удалить 14ю строку. | ||
| + | sed -i ' | ||
| + | # Удалить строку содержащую Network или network. | ||
| + | sed -i '/ | ||
| + | # Добавить в конец файла " | ||
| + | sed -i '$ a \\n[mounts]\nuser root' / | ||
| + | # После 14ой строки добавить "echo " | ||
| + | sed '14a\ echo \" | ||
| + | # Вставить в начало файла '# vim: ft=ruby' | ||
| + | sed '1i # vim: ft=ruby\n' | ||
| + | # Заменить повторяющиеся пустые строки на одну пустую строку | ||
| + | sed -e ': | ||
| + | # Конвертация переносов строк DOS (CR/LF) в Unix (LF) | ||
| + | sed ' | ||
| + | # Заменить строку string1 строкой string2 | ||
| + | sed ' | ||
| + | # Изменить строку anystring1 на anystring2 | ||
| + | sed ' | ||
| + | # Убрать комментарии и пустые строки | ||
| + | sed '/ *#/d; /^ *$/d' | ||
| + | # Соединить строки (линии) с предшествующим \ | ||
| + | sed ':a; /\\$/N; s/\\\n//; ta' | ||
| + | # Удалить предшествующие пробелы строк | ||
| + | sed 's/[ \t]*$//' | ||
| + | # Закомментировать активные метасимволы оболочки двумя кавычками | ||
| + | sed ' | ||
| + | # Выровнять числа по правой границе | ||
| + | seq 10 | sed " | ||
| + | # Напечатать 1000-ную строку | ||
| + | sed -n ' | ||
| + | # Напечатать строки с 10 по 20-ую | ||
| + | sed -n ' | ||
| + | # Получить title из HTML страницы | ||
| + | sed -n ' | ||
| + | # Убрать пустые строки из файла | ||
| + | sed '/ | ||
| + | # Удаляем из всех .html файлов начало до тэга <pre> | ||
| + | # и от </ | ||
| + | cat *.html | sed ' | ||
| + | </ | ||
| + | http:// | ||
| + | |||
| + | Обучалка по sed с примерами: | ||
| + | |||
| + | ==== Замена абзацев ==== | ||
| + | Полный ужас | ||
| + | <code bash> | ||
| + | # build.gradle.kts | ||
| + | sed -i '/val artifactStorage =/c\ | ||
| + | val nexusUrl: String by project\ | ||
| + | val nexusUser: String by project\ | ||
| + | val nexusPass: String by project' | ||
| + | |||
| + | sed -i '/ | ||
| + | allprojects {\ | ||
| + | repositories {\ | ||
| + | maven {\ | ||
| + | setUrl(" | ||
| + | credentials {\ | ||
| + | username = nexusUser\ | ||
| + | password = nexusPass\ | ||
| + | }\ | ||
| + | }\ | ||
| + | maven {\ | ||
| + | setUrl(" | ||
| + | credentials {\ | ||
| + | username = nexusUser\ | ||
| + | password = nexusPass\ | ||
| + | }\ | ||
| + | }\ | ||
| + | mavenLocal()\ | ||
| + | }\ | ||
| + | }' build.gradle.kts | ||
| + | |||
| + | sed -i '/val releases =/,/ | ||
| + | setUrl(" | ||
| + | credentials {\ | ||
| + | this.password = nexusPass\ | ||
| + | this.username = nexusUser' | ||
| + | </ | ||
| + | |||
| + | ===== split ===== | ||
| + | split - split a file into pieces | ||
| + | <code bash> | ||
| + | split -l 2 file1 # Разделить file1 на файлы, где будет по 2 строки из него | ||
| + | </ | ||
| + | |||
| + | ===== su, sudo ===== | ||
| + | '' | ||
| + | <code bash> | ||
| + | # войти от учётки vasya | ||
| + | su vasya | ||
| + | # войти от учётки vasya + его переменные окружения | ||
| + | su - vasya | ||
| + | # войти под рутом | ||
| + | su | ||
| + | # запустить одну команду без полноценного входа | ||
| + | su -c ' | ||
| + | </ | ||
| + | '' | ||
| + | <code bash> | ||
| + | # разрешить пользователю '' | ||
| + | User_Alias ADMINS = vasya | ||
| + | Cmnd_Alias ID = /usr/bin/id | ||
| + | ADMINS | ||
| + | </ | ||
| + | Лучше всего не редактировать сам файл ''/ | ||
| + | <code bash> | ||
| + | includedir / | ||
| + | </ | ||
| + | и описывать правила в отдельных файлах в этой папке. Например, | ||
| + | <code bash> | ||
| + | # запускать команду id | ||
| + | vasya ALL=(root) NOPASSWD:/ | ||
| + | # или вообще входить под рутом без пароля с его переменными окружения | ||
| + | vasya ALL=(root) NOPASSWD:/ | ||
| + | </ | ||
| + | Проверить, | ||
| + | <code bash> | ||
| + | sudo -l | ||
| + | </ | ||
| + | Можно вести логи, для этого в ''/ | ||
| + | <code bash> | ||
| + | Defaults | ||
| + | </ | ||
| + | Сохранять ввод и вывод команд | ||
| + | <code bash> | ||
| + | Defaults | ||
| + | Defaults | ||
| + | Defaults | ||
| + | %admins | ||
| + | </ | ||
| + | |||
| + | [[https:// | ||
| + | ===== test ===== | ||
| + | test - check file types and compare values | ||
| + | <code bash> | ||
| + | test -f file1 # если файл есть, возврат true | ||
| + | test -w file1 # можно ли писать в файл | ||
| + | test 1 -gt 2 && echo " | ||
| + | false | ||
| + | [ 5 -eq 5 ]; echo $? | ||
| + | 0 | ||
| + | [ 5 -eq 3 ]; echo $? | ||
| + | 1 | ||
| + | [ " | ||
| + | 1 | ||
| + | </ | ||
| + | |||
| + | ^Options\Value ^non-empty ^empty ^not set \ not declared ^ | ||
| + | |**-v** |true |true |false | | ||
| + | |**-z** |false |true |true | | ||
| + | |**-n** |true |false |false | | ||
| + | |**-z +set** |false |false |true | | ||
| + | |**-n +set** |true |true |false | | ||
| + | |**-z -unset** |false |true |false | | ||
| + | |**-n -unset** |true |false |true | | ||
| + | [[https:// | ||
| + | ===== wc ===== | ||
| + | Word count. | ||
| + | <code bash> | ||
| + | cat file* |wc -l # Общее кол-во строк в файлах, | ||
| + | </ | ||
| + | |||
| + | ===== wget ===== | ||
| + | При зеркалировании wget сам создаёт каталог с копией, | ||
| + | <code bash> | ||
| + | # --show-progress -q - тихий режим, но показывать прогресс | ||
| + | # -m, --mirror | ||
| + | # -p, --page-requisites | ||
| + | # -k, --convert-links | ||
| + | # -E, --adjust-extension | ||
| + | # -c, --continue | ||
| + | # -t, --tries=NUMBER | ||
| + | # -np, --no-parent | ||
| + | wget --show-progress -qmpkEc -t0 -np http:// | ||
| + | </ | ||
| + | |||
| + | https:// | ||
| + | ===== zip / unzip ===== | ||
| + | <code bash> | ||
| + | # список файлов в архиве | ||
| + | unzip -l file.zip | ||
| + | # извлечь один файл | ||
| + | unzip home/ | ||
| + | </ | ||
