Основы / awk / sed / Регулярные выражения / Полезные команды Bourne shell (/bin/sh) присутствует во всех Unix системах, соответственно скрипты, написанные на этом языке, будут работать на любой Unix-машине. Для прочтения: man 1 sh. Незаменимая вещь при настройке и обслуживании сервера.
Основые понятия о shell скриптах
Переменные и аргументы командной строки
Присваивание значений переменным производится следующим образом: variable=value, получить присвоенное значение можно по ссылке $variable.
MESSAGE=»Hello World» # Присвоить переменной строку «Hello World» PI=3.1415 # Присвоить цифровое значение N=8 TWON=`expr $N * 2` # Присвоить арифметическое выражение (только целые числа) TWON=$(($N * 2)) # Другой вариант TWOPI=`echo «$PI * 2» | bc -l` # Использование bc для операций с плавающей точкой ZERO=`echo «c($PI/4)-sqrt(2)/2» | bc -l`
Аргументы командной строки:
Специальные переменные
$$ # ID текущего процесса $? # Код возврата последней выполненной команды command if [ $? != 0 ]; then echo «command failed» fi mypath=`pwd` mypath=$/file.txt echo $ # Вывести только имя файла echo $ # Полный путь без расширения var2=$ # Если var назначена, использовать ее значение, иначе string # значение string будет присвоено и var и var2.
Конструкции
shell programming
for file in `ls` do echo $file done count=0 while [ $count -lt 5 ]; do echo $count sleep 1 count=$(($count + 1)) done myfunction() < find . -type f -name «*.$1» -print # $1 -первый аргумент функции > myfunction «txt»
Простенький скрипт генерирующий файл
MYHOME=/home/colin cat > testhome.sh # Все до символа _EOF, записывается в файл testhome.sh if [ -d «$MYHOME» ] ; then echo $MYHOME exists else echo $MYHOME does not exist fi _EOF sh testhome.sh
Еще один пример скрипта на bourne shell
В данном примере, скрипт создает PDF буклет, из XHTML документа:
awk
Awk — это весьма мощьный и полезный язык для обработки текстовой информации. Кучу примеров, без труда можно найти в сети, здесь приведены лишь несколько простых:
awk ‘< print $2, $1 >’ file # Вывести из файла 2 колонки, поменя из местами awk » file # Форматирование вывода с номерами строк awk » files # Несколько измененный вариант awk NF test.txt # Удалить из вывода пустые строки (аналогично grep ‘.’) awk ‘length > 80’ # Напечатать строки, длинной более 80 символов
sed
Sed — это неинтерактивный строчный редактор, принимает текст с устройства stdin или из текстового файла, выполняет некоторые со строками и выводит в stdout или в файл. Часто применяется в конвейерной обработке данных совместно с другими командами.
sed ‘s/string1/string2/g’ # Заменить string1 на string2 cat ./wrong.txt | sed ‘s/wrong/right/g’ > ./right.txt # Вывести содержимое файла, заменить слова и записать в другой файл sed ‘s/(.*)1/12/g’ # Модифицировать «строку1» в «строку2» sed ‘/
/,//d’ t.xhtml # Удалить строки, начинающиеся с ⁢p> # И заканчивающиеся
Shell Program Explained
sed ‘/ *#/d; /^ *$/d’ # Удалить комментарии и пустые строки sed ‘s/[ t]*$//’ # Удалить символы табуляции sed ‘s/^[ t]*//;s/[ t]*$//’ # Удалить пробелы в начале и конце sed ‘s/[^*]/[s/n/t/’ # Порядковый номер в каждой строке
regex — регулярные выражения
[^$.|?*+() # Специальные символы, остальные символы означают самих себя # Экранирует специальные символы * # Повтор 0 или 1 раз . # Любой символ, за исключением символа новой строки .* # Совпадает 0 или более символов ^ # Начало строки $ # Конец строки .$ # Совпадает с одним любым символ в конце строки ^ $ # Совпадает со строкой, состоящей из одного пробела [^A-Z] # Любые символы, не входящие в диапазон от А до Z
Некоторые полезные команды
Следующие команды могут пригодиться для использования как в скриптах, так и просто из командной строки:
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n # Отсортировать IPv4 ip адреса echo ‘Test’ | tr ‘[:lower:]’ ‘[:upper:]’ # Смена регистра символов echo foo.bar | cut -d . -f 1 # Вернет foo PID=$(ps | grep script.sh | grep bin | awk ») # PID запущенного скрипта PID=$(ps axww | grep [p]ing | awk ») # PID процесса ping IP=$(ifconfig $INTERFACE | sed ‘/.*inet addr:/!d;s///;s/ .*//’) # Linux IP=$(ifconfig $INTERFACE | sed ‘/.*inet /!d;s///;s/ .*//’) # FreeBSD if [ `diff file1 file2 | wc -l` != 0 ]; then [. ] fi # Файл изменен? cat /etc/master.passwd | grep -v root | grep -v *: | awk -F»:» # Создание файла паролей http passwd ‘< printf(«%s:%sn», $1, $2) >’ > /usr/local/etc/apache2/passwd testuser=$(cat /usr/local/etc/apache2/passwd | grep -v # Проверить пользователя в passwd root | grep -v *: | awk -F»:» ‘< printf(«%sn», $1) >’ | grep ^user$) :()< :|:;: # bash fork bomb :). Убьет вашу машину )) tail +2 file > file2 # Удалить первую строку из файла
Я использую этот небольшой трюк, что-бы разом изменить расширение для кучи файлов, например с *.cxx на *.cpp. (советую для начала протемтировать данный пример, без | sh в конце строки. Тоже самое можно смделать с помощью команды rename, если она присутствует, или с помошью встроенных средст оболочки.
# ls *.cxx | awk -F. » | sh # ls *.c | sed «s/.*/cp .$(date «+%Y%m%d»)/» | sh # Копировать файлы *.c в *.c.20080401 # rename .cxx .cpp *.cxx # Переименовать все файлы .cxx в cpp # for i in *.cxx; do mv $i $.cpp; done # Встроенными средствами
Источник: vds-admin.ru
Примеры Bash скриптов
Существует достаточное количество оболочек, например — sh, zsh, ksh и другие. Но мы остановимся на Bash, ведь это самая популярная оболочка среди Linux. Теперь даже Microsoft добавила поддержку Bash.
Эта статья предназначена для тех кто хоть немного знаком с языком сценариев Bash. Давайте рассмотрим некоторые примеры Bash скриптов, которые могут быть полезными в вашей повседневной работе.
Примеры Bash скриптов в Linux
Чтобы посмотреть какой интерпретатор команд у вас используется введите команду:
Как видите у меня установлен именно Bash.
1. Первая программа. Модификация команды ‘rm’
#!/bin/bash
dir=»$HOME/.archive/» # directory for deleted files
if [ -d $dir ]; then # check the directory .archive/
file=»$1″
null=»»
else mkdir $dir | chmod 700 $dir # if there is no, create
fi
if [ $file == $null ]; then # error, if not specified file #
echo -e «/! No file.. Usage: $0 filename 😉 | archive directory — $dir /! »
exit 1
fi
mv $file $dir$(date «+%H.%d.%m»).$file # move file to .archive/
Все мы знаем что делает команда rm, она удаляет файлы. Эта программа создает папку ~/.archive. Далее проверяет задан ли аргумент. Без аргумента программа выдаст сообщение об ошибке и прекратит работу. Если ей передан путь к файлу, она помещает его в директорию ~/.archive и добавляет дату(час,день,месяц) в начало имя файла, чтобы мы могли понять когда удалили файл.
Далее я приведу еще несколько программ, но без обяснений. Эти программы можно модифицировать, улучшать как угодно. Попробуйте написать что-то свое.
2. Проверка наличия пути к программе в переменной PATH
#!/usr/bin/bash
in_path() cmd=$1 ourpath=$2 result=1
oldIFS=$IFS IFS=»:»
for directory in «$ourpath»
do
if [ -x $directory/$cmd ]; then
result=0
fi
done
IFS=$oldFS
return $result
>
##########
4ck() var=$1
if [ «$var» != «» ]; then
if [ «$» = «/» ]; then
if [ ! -x $var ];then
return 1
fi
elif ! in_path $var «$PATH» ; then
return 2
fi
fi
>
##############################
if [ $# -ne 1 ]; then
echo «Usage: $0 command» >$1″
case $? in
0 ) echo «[$1] found in PATH» ;;
1 ) echo «[$1] not found or not executable» ;;
2 ) echo «[$1] not found in PATH» ;;
esac
exit 0
#############################
3. Нормализация вывода даты
#!/bin/bash
monthto() case $1 in
1 ) month=»Jan» ;; 7 ) month=»Jul» ;;
2 ) month=»Feb» ;; 8 ) month=»Aug» ;;
3 ) month=»Mar» ;; 9 ) month=»Sep» ;;
4 ) month=»Apr» ;; 10 ) month=»Oct» ;;
5 ) month=»May» ;; 11 ) month=»Nov» ;;
6 ) month=»Jun» ;; 12 ) month=»Dec» ;;
* ) echo «$0: Unknown month value $1» >
#################
if [ $# -ne 3 ] ; then
echo «Usage: $0 month day year» >Formats are August 3 1962 and 8 3 1962″ > then
echo «$O: expected 4-digit year value.» > then
monthto $1
else
month=»$(echo $1 | cut -c1 | tr ‘[:lower:]’ ‘[:upper:]’)»
month=»$month$(echo $1 | cut -c2-3 | tr ‘[:upper:]’ ‘[:lower:]’)»
fi
echo $month $2 $3
exit 0
4. Создание библиотек сценариев
Библиотеки — это сценарии которые можно включать в другие сценарии.
Такие сценари можно легко включить в другой файл командой source и вызвав нужную вам фунцию.
Заключение
Сегодня мы разобрали несколько примеров Bash скриптов. Узнали как их исползовать в виде библиотечных сценариев. Очень много полезного можно написать на Bash, ограничение тому лишь ваше воображение. Но на самом деле, тема Bash скриптов велика и есть целые книги посвященные этой теме. Надеюсь статья была полезна.
Про основы работы с Bash вы можете прочитать здесь.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Источник: losst.pro
19 полезных shell-скриптов на все случаи жизни
Командная строка и те невообразимые вещи, которые с ее помощью можно творить, — визитная карточка UNIX и всех ее наследников. А где есть командная строка, там есть скрипты. И сегодня. нет, мы не будем учиться писать скрипты, мы рассмотрим наиболее полезные из них, те, что ты сможешь применять ежедневно для решения самого разного круга задач, начиная от сводки погоды и веб-сервера в одну строку и заканчивая ботом для твиттера в десять строк и скриптом для автоматического запуска любого торрент-клиента.
Сразу оговорюсь, что я вовсе не приверженец шаманизма и ни в коем случае не призываю тебя сидеть в зелено-черной консоли и набирать кучу букв, чтобы выполнить действия, для которых в графическом интерфейсе достаточно навести мышку на нужный элемент. Однако я убежден, что для решения многих задач консоль и скрипты годятся гораздо лучше графического интерфейса и поэтому пренебрегать ими никак нельзя. Тем более что любая DE позволяет создать для скрипта иконку, так что для его запуска даже не надо будет открывать консоль.
Простые примеры
Итак, не разглагольствуя понапрасну, сразу перейдем к примерам:
$ curl ifconfig.co
Эта простая команда покажет тебе внешний IP — идеальный вариант, если в Сеть ты ходишь через роутер. Все, что она делает, — просто обращается к серверу ifconfig.co, который возвращает обратно IP-шник одной строкой вместо полноценной веб-страницы.
И да, это вовсе не скрипт, это просто команда, но, чтобы превратить команду в скрипт, достаточно поместить ее в текстовый файл и первой строкой добавить так называемый шебанг, то есть символы #!, за которыми следует имя командного интерпретатора:
#!/bin/bash curl ifconfig.co
Далее скрипт сохраняем в каталог ~/bin и назначаем права на исполнение:
$ chmod +x ~/bin/myip.sh
Теперь его можно вызывать из командной строки командой myip.sh.
#!/bin/sh curl -4 wttr.in/Moscow
Этот скрипт позволяет получить сводку погоды на четыре дня. Принцип тут такой же, как в случае с ifconfig.co.
Другие статьи в выпуске:
Xakep #212. Секреты даркнета
- Содержание выпуска
- Подписка на «Хакер» -60%
#!/bin/sh dig +short txt $1.wp.dg.cx
А так можно получить краткое описание чего-либо в Википедии, причем с помощью DNS-запроса вместо обращения к веб-серверу. Кстати, веб-сервер через командную строку тоже очень легко создать:
#!/bin/sh while ( nc -l 80 < file.html >: ) ; do : ; done