Bash: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Новая: ==Работа с файлами содержащими пробелы== #!/bin/bash OLD_IFS=$IFS IFS=$(echo "") for i in $(ls *.odt) do echo "$i" done IFS=$OLD_IFS (11:31:41) ...)
 
 
(не показаны 23 промежуточные версии 2 участников)
Строка 1: Строка 1:
 +
==resizer.sh==
 +
 +
#!/bin/bash
 +
imgprefix='resized'
 +
mkdir CONVERTED
 +
for i in $(ls *.jpeg)
 +
do
 +
convert -resize 600x800 $i CONVERTED/$imgprefix-$i
 +
echo "Foto $i converted to $imgprefix-$i"
 +
done
 +
 +
==Ссылки==
 +
[http://www.k-max.name/linux/osnovnye-komandy-linux-ili-shpargalka-nachinayushhego-linuksojda клевый список по командам --- http://www.k-max.name/linux/osnovnye-komandy-linux-ili-shpargalka-nachinayushhego-linuksojda]
 +
 
==Работа с файлами содержащими пробелы==
 
==Работа с файлами содержащими пробелы==
  
Строка 12: Строка 26:
 
(11:31:41) Юрий Азовцев: переопределяем переменную окружения IFS (она содержит символ - разделения слов в строке), меняем его на символ \n - перевода на новую строку - и все хокей
 
(11:31:41) Юрий Азовцев: переопределяем переменную окружения IFS (она содержит символ - разделения слов в строке), меняем его на символ \n - перевода на новую строку - и все хокей
  
====
+
==Загрузка файла с хоста уменьшающего скорость==
 +
 
 +
#!/bin/bash
 +
#antishaper.sh
 +
for i in $(seq 1 100)
 +
do
 +
wget -c $1 & 
 +
wget_pid=$!
 +
sleep 20s #ожидаем 20 секунд
 +
ps ux | grep $wget_pid | grep wget
 +
if [ $? -eq '1' ]
 +
then
 +
exit 1
 +
fi
 +
kill $wget_pid
 +
done
 +
 
 +
==Бэкапы с уделением бэкапов старше 30 дней==
 +
 
 +
#!/bin/bash
 +
#backuper.sh
 +
tar -czpf $(date +%Y-%m-%d)-backup.tar.gz $1
 +
echo "Backup Finished"
 +
period=2592000
 +
for i in $(ls *-backup.tar.gz)
 +
do
 +
time=${i%-backup.tar.gz}
 +
file_utime=$(date --date="$time" +%s)
 +
cur_utime=$(date +%s)
 +
if [ $(($cur_utime - $file_utime)) -gt $period ]
 +
then
 +
rm $i
 +
echo "File $i deleted"
 +
fi
 +
done
 +
 
 +
==Убрать теги из html==
 +
Как работает sed
 +
sed 's/чего/на что/g' index.html
 +
или
 +
cat index.html | sed 's/чего/на что/g'
 +
 
 +
Задача: Есть файл index.html, содержащий текст и теги. Нужно удалить из файла все теги и оставить только голый текст.
 +
 
 +
index.html:
 +
<pre>
 +
<p><b>Википедия</b> — свободная энциклопедия, в которой<br>
 +
<i>каждый</i> может изменить или дополнить любую статью</p>
 +
</pre>
 +
 
 +
Скрипт:
 +
cat index.html | sed 's/<[ \=\"a-zA-Z0-9\/]*>//g'
 +
 
 +
 
 +
<[a-zA-Z0-9\/]*> - означает, искать строку, начинающуюся с символа "<" и заканчивающейся ">" и любым количеством символов из набора [a-zA-Z0-9\/] между ними (* - любое кол-во символов из набора).
 +
 
 +
==Замена в файле sources.list==
 +
 
 +
Замена в файле /etc/apt/sources.list одной версии дистрибутива (lucid) на другую (precise).
 +
 
 +
sed 's/lucid/precise/g' /etc/apt/sources.list
 +
 
 +
Заменить в файле /etc/apt/sources.list адрес репозитория с http://security.ubuntu.com/ubuntu на ftp://repo/repository<br>
 +
deb http://security.ubuntu.com/ubuntu lucid-security main restricted<br>
 +
deb http://security.ubuntu.com/ubuntu precise-security main restricted
 +
 
 +
sed 's/lucid/precise/g' /etc/apt/sources.list | sed 's/http:\/\/security.ubuntu.com\/ubuntu/ftp:\/\/repo\/repository/g'  #Не забыть заэкранировать спецсимвол "/" использующийся в URL
 +
 
 +
==Преобразование текста==
 +
[[media:mac-ip.txt]]
 +
{|
 +
!Есть список Mac и соответствующих IP
 +
!Нужно получить конфигурационный файл dhcpd.conf вида:
 +
|-
 +
|
 +
<pre>
 +
0A-71-91-5C-C3-93 192.168.10.5
 +
CD-FC-BD-4C-4E-E5 192.168.10.6
 +
E4-2C-53-4C-AB-94 192.168.10.7
 +
9F-5B-44-F4-F4-0C 192.168.10.8
 +
7A-62-27-8E-FC-4E 192.168.10.9
 +
10-06-C0-A1-62-84 192.168.10.10
 +
34-30-80-F2-7C-CF 192.168.10.11
 +
D7-61-FB-2B-AD-A7 192.168.10.12
 +
C0-4D-02-04-41-F7 192.168.10.13
 +
10-BC-59-38-4A-55 192.168.10.14
 +
87-5B-5C-47-FC-BF 192.168.10.15
 +
CC-31-EF-4C-24-6C 192.168.10.16
 +
</pre>
 +
|
 +
<pre>
 +
host office-pc-05 {
 +
        hardware ethernet 0A:71:91:5C:C3:93;
 +
        fixed-address 192.168.10.5;
 +
      }
 +
</pre>
 +
|}
 +
 
 +
<pre>
 +
#!/bin/bash
 +
 +
for i in $(cat mac-ip.txt|awk '{print $1"_"$2}')                    #Берем строку и заменяем в ней разделяющий слова ПРОБЕЛ на символ "_" (в дальнейшем по нему будет разрезать строку)
 +
    do
 +
mac=$(echo $i|sed 's/-/:/g'|awk -F "_" '{print $1}')        #Выводим строку из переменной i в поток, заменяем все символы "-" на символ ":", разбираем строку по символу "_" и берем только первое свлово
 +
ip=$(echo $i|awk -F "_" '{print $2}')                        #Выводим строку из переменной i в поток, разбираем строку по символу "_", берем только второе слово
 +
hostNumber=$(echo $ip|awk -F "." '{print $4}')              #Выводим строку из переменной ip, разбираем строку по символу ".", берем только 4-е слово (используем его для формирования имени хоста)
 +
echo "host office-pc.$hostNumber {" >>dhcpd.conf
 +
echo "hardware ethernet $mac;" >>dhcpd.conf
 +
echo "fixed-addres $ip;" >>dhcpd.conf
 +
echo "}" >>dhcpd.conf
 +
echo "" >>dhcpd.conf
 +
    done
 +
</pre>
 +
 
 +
 
 +
Возможно решить данную задачу командой в одну строку. Но нету возможности фирмировать имя хоста в соответствии с IP
 +
cat mac-ip.txt | sed 's/-/:/g' | awk '{ print "host office-pc- {\n hardware ethrenet " $1 ";\n fixed-address " $2 ";\n }"
 +
 
 +
==Магия с изображениями при подготовке скриншотов==
 +
 
 +
для запуска любой из команды нужно встать в каталог с файлами изображений и открыть терминал
 +
 
 +
переименовать по порядку (копирование)
 +
 
 +
ls *.png | sort > q.txt;q=1;while read LINE; do cp "$LINE" "image_1_$q.png";q=$(($q+1)); done < q.txt;/bin/rm q.txt
 +
 
 +
 
 +
переименовать по порядку (перемещение)
 +
 
 +
ls *.png | sort > q.txt;q=1;while read LINE; do mv "$LINE" "image_1_$q.png";q=$(($q+1)); done < q.txt;/bin/rm q.txt
 +
 
 +
переименовать по порядку и приделать рамку серого цвета в 5 пикс.
 +
 
 +
ls *.png | sort > q.txt;q=1;while read LINE; do montage -border 5 -geometry +0+0 -compose copy -bordercolor gray "$LINE" "image_1_$q.png";/bin/rm "$LINE";echo $q;q=$(($q+1));done < q.txt;/bin/rm q.txt
 +
 
 +
==Writer==
 +
 
 +
Сделать заготовку из картинок для создания лекции:
 +
 
 +
ls *.png | sort > q.txt;q=1;while read LINE; do echo "Text $LINE<br /><img src=\"$LINE\"><br />">>q.html; done < q.txt;/bin/rm q.txt
 +
 
 +
Затем открыть файл в браузере и пересохранить в формат html - чтобы создался каталог с изображениями и правильно сформировался html. Затем html импортировать во Writer
 +
 
 +
 
 +
==Разное 1==
 +
 
 +
<pre>
 +
#!/bin/bash
 +
for i in $(ls ./sites-enabled)
 +
do
 +
 
 +
echo "$i"
 +
 
 +
cat sites-enabled/$i | sed 's/NameVirtualHost/#NameVirtualHost/g' > /tmp/htmp
 +
cat /tmp/htmp > sites-enabled/$i
 +
 
 +
done
 +
 
 +
</pre>

Текущая версия на 00:32, 27 августа 2018

resizer.sh

#!/bin/bash
imgprefix='resized'
mkdir CONVERTED
for i in $(ls *.jpeg)
do
convert -resize 600x800 $i CONVERTED/$imgprefix-$i
echo "Foto $i converted to $imgprefix-$i"
done

Ссылки

клевый список по командам --- http://www.k-max.name/linux/osnovnye-komandy-linux-ili-shpargalka-nachinayushhego-linuksojda

Работа с файлами содержащими пробелы

#!/bin/bash
OLD_IFS=$IFS
IFS=$(echo "")
for i in $(ls *.odt)
do
echo "$i"
done
IFS=$OLD_IFS

(11:31:41) Юрий Азовцев: переопределяем переменную окружения IFS (она содержит символ - разделения слов в строке), меняем его на символ \n - перевода на новую строку - и все хокей

Загрузка файла с хоста уменьшающего скорость

#!/bin/bash
#antishaper.sh
for i in $(seq 1 100) 
do 
	wget -c $1 &  
	wget_pid=$! 
	sleep 20s #ожидаем 20 секунд
	ps ux | grep $wget_pid | grep wget
	if [ $? -eq '1' ]
		then
		exit 1
	fi
	kill $wget_pid
done

Бэкапы с уделением бэкапов старше 30 дней

#!/bin/bash
#backuper.sh
tar -czpf $(date +%Y-%m-%d)-backup.tar.gz $1
echo "Backup Finished"
period=2592000
for i in $(ls *-backup.tar.gz)
do
	time=${i%-backup.tar.gz}
	file_utime=$(date --date="$time" +%s)
	cur_utime=$(date +%s)
	if [ $(($cur_utime - $file_utime)) -gt $period ]
	then 
		rm $i
		echo "File $i deleted"
	fi
done

Убрать теги из html

Как работает sed

sed 's/чего/на что/g' index.html

или

cat index.html | sed 's/чего/на что/g'

Задача: Есть файл index.html, содержащий текст и теги. Нужно удалить из файла все теги и оставить только голый текст.

index.html:

<p><b>Википедия</b> — свободная энциклопедия, в которой<br> 
<i>каждый</i> может изменить или дополнить любую статью</p>

Скрипт:

cat index.html | sed 's/<[ \=\"a-zA-Z0-9\/]*>//g'


<[a-zA-Z0-9\/]*> - означает, искать строку, начинающуюся с символа "<" и заканчивающейся ">" и любым количеством символов из набора [a-zA-Z0-9\/] между ними (* - любое кол-во символов из набора).

Замена в файле sources.list

Замена в файле /etc/apt/sources.list одной версии дистрибутива (lucid) на другую (precise).

sed 's/lucid/precise/g' /etc/apt/sources.list

Заменить в файле /etc/apt/sources.list адрес репозитория с http://security.ubuntu.com/ubuntu на ftp://repo/repository
deb http://security.ubuntu.com/ubuntu lucid-security main restricted
deb http://security.ubuntu.com/ubuntu precise-security main restricted

sed 's/lucid/precise/g' /etc/apt/sources.list | sed 's/http:\/\/security.ubuntu.com\/ubuntu/ftp:\/\/repo\/repository/g'   #Не забыть заэкранировать спецсимвол "/" использующийся в URL

Преобразование текста

media:mac-ip.txt

Есть список Mac и соответствующих IP Нужно получить конфигурационный файл dhcpd.conf вида:
0A-71-91-5C-C3-93 192.168.10.5
CD-FC-BD-4C-4E-E5 192.168.10.6
E4-2C-53-4C-AB-94 192.168.10.7
9F-5B-44-F4-F4-0C 192.168.10.8
7A-62-27-8E-FC-4E 192.168.10.9
10-06-C0-A1-62-84 192.168.10.10
34-30-80-F2-7C-CF 192.168.10.11
D7-61-FB-2B-AD-A7 192.168.10.12
C0-4D-02-04-41-F7 192.168.10.13
10-BC-59-38-4A-55 192.168.10.14
87-5B-5C-47-FC-BF 192.168.10.15
CC-31-EF-4C-24-6C 192.168.10.16
host office-pc-05 {
        hardware ethernet 0A:71:91:5C:C3:93;
        fixed-address 192.168.10.5;
      }
 #!/bin/bash
 
 for i in $(cat mac-ip.txt|awk '{print $1"_"$2}')                    #Берем строку и заменяем в ней разделяющий слова ПРОБЕЛ на символ "_" (в дальнейшем по нему будет разрезать строку)
    do
	mac=$(echo $i|sed 's/-/:/g'|awk -F "_" '{print $1}')         #Выводим строку из переменной i в поток, заменяем все символы "-" на символ ":", разбираем строку по символу "_" и берем только первое свлово 
	ip=$(echo $i|awk -F "_" '{print $2}')                        #Выводим строку из переменной i в поток, разбираем строку по символу "_", берем только второе слово
	hostNumber=$(echo $ip|awk -F "." '{print $4}')               #Выводим строку из переменной ip, разбираем строку по символу ".", берем только 4-е слово (используем его для формирования имени хоста)
	echo "host office-pc.$hostNumber {" >>dhcpd.conf
	echo "hardware ethernet $mac;" >>dhcpd.conf
	echo "fixed-addres $ip;" >>dhcpd.conf
	echo "}" >>dhcpd.conf
	echo "" >>dhcpd.conf
    done


Возможно решить данную задачу командой в одну строку. Но нету возможности фирмировать имя хоста в соответствии с IP

cat mac-ip.txt | sed 's/-/:/g' | awk '{ print "host office-pc- {\n hardware ethrenet " $1 ";\n fixed-address " $2 ";\n }"

Магия с изображениями при подготовке скриншотов

для запуска любой из команды нужно встать в каталог с файлами изображений и открыть терминал

переименовать по порядку (копирование)

ls *.png | sort > q.txt;q=1;while read LINE; do cp "$LINE" "image_1_$q.png";q=$(($q+1)); done < q.txt;/bin/rm q.txt


переименовать по порядку (перемещение)

ls *.png | sort > q.txt;q=1;while read LINE; do mv "$LINE" "image_1_$q.png";q=$(($q+1)); done < q.txt;/bin/rm q.txt

переименовать по порядку и приделать рамку серого цвета в 5 пикс.

ls *.png | sort > q.txt;q=1;while read LINE; do montage -border 5 -geometry +0+0 -compose copy -bordercolor gray "$LINE" "image_1_$q.png";/bin/rm "$LINE";echo $q;q=$(($q+1));done < q.txt;/bin/rm q.txt

Writer

Сделать заготовку из картинок для создания лекции:

ls *.png | sort > q.txt;q=1;while read LINE; do echo "Text $LINE
<img src=\"$LINE\">
">>q.html; done < q.txt;/bin/rm q.txt

Затем открыть файл в браузере и пересохранить в формат html - чтобы создался каталог с изображениями и правильно сформировался html. Затем html импортировать во Writer


Разное 1

#!/bin/bash
for i in $(ls ./sites-enabled)
do

echo "$i"

cat sites-enabled/$i | sed 's/NameVirtualHost/#NameVirtualHost/g' > /tmp/htmp
cat /tmp/htmp > sites-enabled/$i

done