==== 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~~