==== help ====
# как узнать версию linux ###version ###linux ###redhat-release ###lsb_release ###uname ###
cat /etc/issue
cat /etc/*-release
==== 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
==== find ====
# Найти все файлы исключая скрытые файлы и скрытые каталоги ###find ###exclude ###hidden
find $SRC -type f -not -path '*/\.*'
find . -name 'objects' -not -path '*.trash*'
# Найти и обработать файлы с пробелами ###find ###xargs
find . -print0 | xargs -0 -n10 echo
# заменить во всех файлах по маске шаблону текст ###find ###sed
find . -type f -name '*.css' ! -path '*/.git/*' -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
==== Прочее ====
# запрет на подстановку * {} 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"
~~OWNERAPPROVE~~