Example Bash

example_bash.1556103242.txt.gz | Хозяин: admin | Изменен: 20.05.2019 15:18 admin | Утвержден(admin 2019/04/24 06:54)
Новейший утвержденный

Это старая версия документа.


syntax

# bash case ###bash ###case ##select
case "$VM_TMPLT_OS" in
centos-6*|centos6*)
        compat_centos6
        ;;
*)
        echo "TODO not support $VM_TMPLT_OS - skip"
        ;;
esac

grub

# grub запустить ядро 1 раз ###savedefault ###default=0 ###once
grub> savedefault --default=0 --once
grub> quit

perf

# профилирование ###perf ###oprofile ###nmi
yum --enablerepo='base-debuginfo' install kernel-debuginfo-`uname -r` kernel-devel perf oprofile gdb kexec-tools crash
perf top -d 5 -U
perf top -d 5 -g -U
perf stat -e task-clock,cycles,instructions,cache-references,cache-misses sleep 5
perf record -a sleep 5 и потом perf report
 
# профилирование ###perf ###oprofile ###nmi
echo 0 > /proc/sys/kernel/nmi_watchdog
opcontrol --deinit
opcontrol --init
opcontrol --reset
opcontrol --start --vmlinux=/usr/lib/debug/lib/modules/2.6.32-642.el6.x86_64/vmlinux
# но иногда можно и --no-vmlinux если нам не важно про ядро, а только про юспейс
# если баг Failed to open profile device: Device or resource busy, то стопаем все виртуалки KVM, одна из них залочила nmi
sleep 10 # ждем сбора статистики
opcontrol --stop
# включаем watchdog обратно
echo 1 > /proc/sys/kernel/nmi_watchdog

find

# Найти все файлы исключая скрытые файлы и скрытые каталоги ###find ###exclude ###hidden
find $SRC -type f -not -path '*/\.*'
 
# Найти и обработать файлы с пробелами ###find ###xargs
find . -print0 | xargs -0 -n10 echo 
 
# заменить во всех файлах по маске шаблону текст ###find ###sed
find . -type f -name '*.css' -exec sed -i 's/http:/https:/g' {} \;
или find . -type f | xargs -n 1 sed -i 's/fox-vz/fox_vz/'
 
# Поиск файлов ###find 
find /var/www/ -name "*.conf" -maxdepth 10
 
# Поиск без учёта регистра: ###find ###case
find /var/www/ -iname file.conf
 
# Поиск по размеру файлов ###find ###size
# size = 1024 bytes
find /home/user -size 1024c
#
# size > 10Mb
find /home/user -size +10M
 
# Поиск по маске прав ###find ###perm
find ./ -perm 700
 
# Поиск по дате ###find ###date ###time
# Файлы созданные или изменённые в течении последних 5 дней
# find /home/user -type f -mtime -5
#
# Файлы созданные или изменённые в течении последних 5 минут
# find /home/user -type f -mmin -5
#
# Найти файлы созданные или изменённые старше 30 дней (ака поиск устаревших файлов):
# find /home/user -type f -mtime +30
 
# Удалить файлы созданные или изменённые старше 30 дней: ###find ###delete
find /home/user -type f -mtime +30 -delete
 
# поиск и запуск внешней программы ###find ###exec
find ./ -type f -exec grep -i -H "STRING"  {} \;
 
# Найти все файлы php в который встречается строка STRING: ###find ###grep
find ./ -type f -name "*.php" -exec grep -i -H "STRING"  {} \;
 
# Найти все файлы за дату с 2017-09-11 по 2017-09-19 ###find ###date
find ./ -newermt '2017-09-11' \! -newermt '2017-09-19'
 
# Посчитать общий размер определенных файлов (например, файлов, которые старше 3х месяцев): ###find ### awk ###du
find /var/mail/test/ -type f -mtime +$((30*3)) -exec du {} \; | awk '{s+=$1} END {print s}'

strongbash

# создание carbon скрипта для strongbash ###bash ###init
#!/bin/bash
set -eu
# __SILENT=1 чтобы не выводить START и SUCCESS
. /opt/crab/crab_utils/bin/crab_sys.sh
sys::usage "$@"
### --help Info: Автоматически создавать и коммитить все файлы в каталоге
### --help Usage: auto_git.sh [install] /var/www/html
### --help Example: auto_git.sh /var/www/html
sys::arg_parse "$@"
### sys::arg_parse txt1 txt2 --name=a1 --dst=a2 --forced -t1 -y txt3
echo "$ARG_1==txt1 $ARG_2==txt2 $ARG_NAME==a1 $ARGV_DST==a2 $ARG_FORCED==TRUE $ARG_T==1 $ARG_Y=TRUE $ARG_3==txt3"
echo "${ARGV[1]}=txt1 ${ARGV[2]}==txt3 ${ARGV[3]}==txt3 ARGC=3"
for var in ${!ARG_@}; do echo $var ${!var}; done 
 
exit 0
 
# создание простого скрипта для strongbash ###bash ###init
#!/bin/bash
set -eu
echo "$0 $@ [$$] START" >&2
if [ "${1:---help}" = "--help" ]; then
         echo 'Info: Автоматически создавать и коммитить все файлы в каталоге'
         echo 'Usage: auto_git.sh [install] /var/www/html'
         echo 'Example: auto_git.sh /var/www/html'
         exit 0
fi
#
echo "$0 $@ [$$] SUCCESS" >&2
exit 0
 
# создание скрипта без crab_sys.sh для strongbash в котором много exit 0 ###bash ###init
#!/bin/bash
set -eu
echo "$0 $@ [$$] START" >&2
if [ "${1:---help}" = "--help" ]; then
         echo 'Info: Автоматически создавать и коммитить все файлы в каталоге'
         echo 'Usage: auto_git.sh [install] /var/www/html'
         echo 'Example: auto_git.sh /var/www/html'
         exit 0
fi
ARGV="$@"
__exit(){
        local ret=$1
        [ "$ret" = 0 ] && echo "$0 $ARGV [$$] SUCCESS" >&2 \
                || echo "$0 $ARGV [$$] FAILED" >&2
        exit $ret
}
 
cmd1
cmd2 || exit_success
cmd3
#
echo "$0 $@ [$$] SUCCESS" >&2
exit 0

Статистика и диагностика

# Кто использует swap ###swap
smem -kts swap
 
# Насколько используется диск ###disk ###io ###iostat
iostat -kt 1
 
# Кто использует диск ###iotop ###disk ###io
iotop -kPd 5
 
#Разовый top по всем процессам ###top
top -n 1 -b
 
# Кто использует swap ###swap
smem -kts swap
 
# slab ###slab
vmstat -m
 
# Просмотр памяти активности за дату 21 число в 16 часов ###sar ###stat ###loadavg
LANG=C sar -r -f /var/log/sa/sa21 | grep 16:
# Просмотр swap активности за дату 21 число в 16 часов ###sar ###stat ###loadavg
LANG=C sar -S -f /var/log/sa/sa21 | grep 16:
# Просмотр loadavg за дату 21 число в 16 часов ###sar ###stat ###loadavg
LANG=C sar -q -f /var/log/sa/sa21 | grep 16:
# Просмотр использования cpu активности за дату 21 число в 16 часов ###sar ###stat ###loadavg
LANG=C sar -u -f /var/log/sa/sa21 | grep 16:

Прочее

# запрет на подстановку * {} asterisk Disable pathname expansion. ###bash ###asterisk ###expansion
set -f
echo *
 
# перевод из unixtime в стандартную дату ###bash ###unixtime ###date
date -d @1458515485
date -d "1970-01-01 UTC 1458515485 sec" +%Y-%m-%d 
 
# форматированный вывод ###bash ###string ###printf ###echo ###hex ###binary
printf "%-7s %-7s %-11s %-12s %-10s %-8s %-11s %s" "vz: $vz_count" "kvm: $kvm_count" "mem: ${freemem}M" "space: ${freespace}G" "load: $loadavg" "hit: ${hit}%" "skip: ${skip}K"
 
# перевод формата ###bash ###string ###printf ###echo ###hex ###binary
# bin2hex
printf '%x\n' "$((2#101010101))"
# bin2dec
echo "$((2#101010101))"
# hex2dec
echo "$((0xff))"
# hex2bin
echo 'obase=2;ibase=16;FFFF0'|bc
echo 'obase=16;ibase=2;11110000'|bc
 
# перебрать все переменные начинающиеся с NET_IF ###bash ###string ###eval ###iterate ###foreach
for i in ${!NET_IF@}; do echo $i; done
 
# безопасный eval ###bash ###string ###eval 
eval declare '"$VAR_NAME"="$VAR_VAL"'
но declare не работает для глобальных переменных в функциях там можно делать хак
eval export -n '"$VAR_NAME"="$VAR_VAL"'
 
# взять слева с нулевого символа 3 символа ###substring ###bash ###string 
str=123456789; echo ${str:0:3} = 123
 
# взять справа от -4 символа 3 символа. Внимание! пробел перед " -4" обязателен  ###substring ###bash ###string 
echo ${a: -4:3} = 678
 
 
# Взять левую часть стоки. Обрезать строку справа до первых букв www  ###substring ###bash ###string 
str='1234 123 www www www asd zxc'
echo ${str%www*} = 1234 123 www www
# Взять левую часть стоки. Обрезать строку справа до последних букв www 
echo ${str%%www*} = 1234 123
 
# Взять правую часть стоки. Обрезать строку слева до первых букв www  ###substring ###bash ###string 
str='1234 123 www www www asd zxc'
echo ${str#*www} = www www asd zxc
# Взять правую часть стоки. Обрезать строку слева до последних букв www
echo ${str##*www} = asd zxc
 
 
# заменить переводы строк на пробелы ###bash ###string ###strreplace
a="${a//$'\n'/ }"
 
# Удалить все файлы кроме 10 последних по дате модификации, полезно для бекапов и логов ###bash ###script 
[ `ls -1  | wc -l` -gt 10 ] && ls -1t | tail -n +10 | xargs -x /bin/echo rm
 
# Удалить все файлы кроме 10 последних по имени файла вида 09.07.15_15-40.sql.bz2, полезно для бекапов и логов ###bash ###script
[ `ls -1  | wc -l` -gt 10 ] && ls -1  | sort  | head -n 2 | xargs -x /bin/echo rm
 
# Удобный bash history ###bash ###bashrc ###history
cat $HOME/.bashrc
export HISTSIZE=10000
export HISTCONTROL="ignoreboth"
shopt -s histappend
shopt -s cmdhist
export HISTTIMEFORMAT="%F %T "
function prompt_cmd(){
         history -a &>/dev/null;
         if ! tail -n 1 ~/.bash_history | grep -qm1 "${SSH_CLIENT *}"; then
                 echo -e "#$(date +%s)\n  ${SSH_CLIENT *}">>~/.bash_history;
         fi
}
PROMPT_COMMAND=prompt_cmd
 
# Пример удобного логирования ###bash ###log
 echo "$(date +'%Y-%m-%d %H:%M:%S') $HOSTNAME ${0##*/}[$$]: $@"
 
# Заменить во всех файлах слова ###sed
sed -i 's/что_менять/на_что_менять/' /path/to/files/*
 
# Удалить строки, содержащие слова ###sed
sed -i '/что_искать/d' /path/to/files/*
 
# напечатать, то что находится в скобке ###sed
sed -n 's/.*href="\/\([^"]*\).*/\1/p'
 
###regexp
[abc]	Один из символов a, b, c	.	Любой символ	(...)	Группировка (группа)
[^abc]	Любой символ кроме a, b, c	\s	Пробельный символ (в т.ч. табуляция)	(a|b)	a или b
[a-z]	Любой символ из диапазона	\S	Любой не пробельный символ	a?	Одна a или пусто
[a-zА-Я]	Любой символ из диапазонов	\d	Любая цифра	a*	Ноль и более раз a
^	Начало строки	\D	Не цифра	a+	Один и более раз a
$	Конец строки	\w	Буква (буквы, цифры, подчеркивание)	a{3}	3 раза a
\A	Начало текста	\W	Не буква (специальные символы)	a{3,}	3 и более раз a
\z	Конец текста	\b	Граница слова (начало или конец)	a{3,5}	От 3 до 5 раз a
\n	Символ новой строки в Unix	\r\n	Символ новой строки в Windows	\t	Символ табуляции
\pL	Буква (в т.ч. русская) в кодировке utf-8, используется с модификатором u
Модификаторы
i	Регистронезависимость. Например "/a/i" ищет и a, и A.
U	Инвертирует "жадность" (по умолчанию жадный, т.е. пытается захватить как можно большую строку, подходящую по условию).
u	Использование кодировки utf-8 (для поиска русского текста например).
m	Многострочный поиск.
s	Символ . (точка) соответствует и переводу строки.
x	Игнорировать пробелы. В этом случае пробелы нужно экранировать обратным слэшем \.
 
###bash ###string
${#name}    Длина строки 	nick 	-> 4
${name%i*}  Удалить наименьшую подстроку "i*" с конца строки 	"Nick Denisov" ->	"Nick Den"
${name%%i*} Удаляет наибольшую подстроку "i*" с конца строки 	"Nick Denisov" ->	"N"
${name#*i}  Удаляет наименьшую подстроку "*i" с начала строки 	"Nick Denisov" ->	"ck Denisov"
${name##*i} Удаляет наибольшую подстроку "*i" с начала строки 	"Nick Denisov" -> "sov"
${name:5}   Извлечение среза из строки 	"Nick Denisov" -> 	"Denisov"
${name: -1} Извлечение среза из строки с конца строки, пробел перед тире обязателен 	"Nick Denisov" -> 	"v"
${name:5:5} Извлечение среза из строки, начиная с 5, но не более 5 символов 	"Nick Denisov" -> 	"Denis"
${name/Denisov/surname} Поиск подстроки в строке, первое совпадание с шаблоном заменяется подстрокой 	"Nick Denisov" -> "Nick surname"
${name//i/I} 	        Глобальная замена. Все найденные совпадения с шаблоном i в name, будут замещены подстрокой I 	"Nick Denisov" -> "NIck DenIsov"
${name/#Nick/Kolya} 	Если в переменной найдено совпадение в начале строки (префикс), то оно заменяется. Поиск ведется с начала строки 	"Nick Denisov" -> "Kolya Denisov"
${name/%Denisov/Kolya} 	Если в переменной найдено совпадение в конце строки (суффикс), то оно заменяется. Поиск ведется с конца строки 	"Nick Denisov" -> "Nick Kolya"

ssh back-connect

# В данной заметке пойдёт речь про более хитрое использование SSH для оказания удалённой помощи серверу, находящемуся за NAT.
# Заходим на машину клиента:
ssh root@10.90.10.150
# На машине клиента выполняем команду
ssh -R 1522:localhost:22 root@gate.carbonsoft.ru -p 22
# Вводим пароль и установливаем соединение.
# Далее на gate.carbonsoft.ru выполняем вход к клиенту.
ssh root@localhost -p 1522

systemd

Очистка кэша DNS

systemd-resolve --flush-caches

~~OWNERAPPROVE~~

Ваш комментарий. Вики-синтаксис разрешён: