os:linux:utils
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
os:linux:utils [08.08.2024 13:58] – [logrotate] viacheslav | os:linux:utils [13.05.2025 12:25] (текущий) – [curl] 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:// | ||
+ | |||
+ | |||
+ | ===== 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 | ||
+ | </ | ||
+ | |||
+ | ===== wc ===== | ||
+ | Word count. | ||
+ | <code bash> | ||
+ | cat file* |wc -l # Общее кол-во строк в файлах, | ||
+ | </ | ||
+ | |||
+ | ===== zip / unzip ===== | ||
+ | <code bash> | ||
+ | # список файлов в архиве | ||
+ | unzip -l file.zip | ||
+ | # извлечь один файл | ||
+ | unzip home/ | ||
+ | </ | ||