Кармический блог быдлокодера

javascript как узнать все свойства объекта

Небольшая функция на javascript, которая позволяет узнать все свойства объекта

Вот сама функция:

function fnShowProps(obj, objName){
    var result = "";
    for (var i in obj) // обращение к свойствам объекта по индексу
        result += objName + "." + i + " = " + obj[i] + "
\n";
    document.write(result);
}

Вот пример исползования:

fnShowProps(window.location, "location")

Результат:


location.pathname = /JavaScript/
location.protocol = http:
location.search = ?8
location.hash =
location.hostname = htmlcssjs.ru
location.href = http://htmlcssjs.ru/JavaScript/?8
location.host = htmlcssjs.ru
location.port =
location.reload = function reload() { [native code] }
location.replace = function replace() { [native code] }
location.assign = function assign() { [native code] }

Источник: http://htmlcssjs.ru/JavaScript/?8

 

foreach в javascript

Во несколько способов реализации foreach в javascript

Вариант 1:

for (var key in some_array) {
            var val = some_array [key];
	    alert (key+' = '+val);	
}

Источник: http://mihalytch.org.ua/programming/php/analogue-foreach-in-javascript.html

Вариант 2:

for(i=0, c=arr.length; i<c; i++) {
	my_func(arr[i]);
}

Нужно отметить, что второй вариант не совсем реализует foreach, так как перебираются только значения массива без ключей.

 

Немного об svn

[announce]Вот небольшой мануал по использованию svn[/announce]

Создать репозитарий можно вот так:

$ svnadmin create new_repo

Настраиваем svn вот так:
Идем в new_repo/conf и открываем в любимом редакторе файл svnserve.conf.
В нём мне пригодилось исправить только секцию [general] вот так:

[general]
anon-access = none
password-db = passwd

anon-access = none — этим сообщаем, что анонимный доступ нужно запретить
password-db = passwd — этим сообщаем, что пароли и логины пользователей svn находится в файле passwd

Файл passwd правим таким образом:

[users]
user = password
Запуск серванта svn в FreeBSD:
Если уже запущен, то убиваем процесс (скорее всего прекращать работу сервера через killall -9 не совсем правильно, да простит меня Джа)

$ killall -9 svnserve
$ svnserve -d -r ./new_repo

Чекаем свой проджект вот так:

$ svn co svn://my_name_user@host_svn/new_repo project_dir

my_name_user — пользователь svn
host_svn — хост с svn
new_repo — наша директория с репозитарием

project_dir — локальная папка проекта

Далее svn спросит пароль, имя ползователя и возможно задаст ещё пару вопросов, отвечаем..
Если всё правильно, то svn выдаст сообщение типа — Checked out revision n,
где n — номер версии (если репозитарий чекается первый раз, то версия будет 0)

Далее добавляем файлы своего проекта в папку проекта (project_dir) и делаем вот так :

$ svn add * Отправляем обновление на svn сервер:

$ svn commit -m «Добавляем файло в нашу репу ;) «

Вот и все! Кратко, дёшево и сердито, как и должно быть у бадлокодера %)))

З.Ы. Не забывайте про руководства svn и google! Всем удачи!

Поиск файла по содержимому этого файла

[announce]То что давно хотел узнать :)[/announce]

Вот так можно найти строку по содержимому файла.

$ find /etc -type f -exec grep -Hn "nameserver" {} \; 2>/dev/null

Вот так можно найти все файлы в каталоге /etc в которых есть слово «nameserver»
Опции grep:

H — выводим имя файла со строкой.
n — номер строки в файле.

Ошибки перенаправляем в /dev/null
При желании можно написать вот такой скрипт:

#/bin/sh

dir='.';
if [ -z $1 ] 
then
	echo 'Команду нужно запускать вот так: find.str  [dir]';
else
	if [ -z $2 ]
	then
		dir=$2
	fi
	
	find . -type f -exec grep -Hn $1 {} \; 2>/dev/null
fi

Вообще вот ссылка полезная — http://www.openspin.org/materials/courses/admin/ch04s02.html

 

Unix — пример работы с текстом

Скачал тут недавно книгу из двух текстовых файлов в koi8-r и с переводами строки в стиле Win (^M)

Решил поправить это дело таким вот образом:

$ cat book_p1.txt book_p2.txt | sed 's/\r//' | iconv -f koi8-r -t utf8 > book.txt

Вот так вот :) Unix — это круто!

Немного о шифровании

Шифрование

Если нужно зашифровать отдельный файл (к примеру архив или документ) — можно воспользоваться утилитой openssl.
Шифрование файла file будет выглядеть так:

$ openssl enc -e -aes-256-cbc -k ПАРОЛЬ -in ./file -out ./file.encoded

или так:

$ cat ./file | openssl enc -e -aes-256-cbc -k ПАРОЛЬ > file.encoded

Параметр -k и пароль можно не указывать, тогда он будет запрошен во время выполнения команды.

вот ещё варианты:

$ openssl aes-128-cbc -salt -in file -out file.aes
$ openssl aes-128-cbc -d -salt -in file.aes -out file

Дешифрование

Расшифровать обратно файл можно будет командой:

$ openssl enc -d -aes-256-cbc -k ПАРОЛЬ -in ./file -out ./file.encoded

(параметр -e меняется на -d) ну или соответственно:

$ cat ./file.encoded | openssl enc -d -aes-256-cbc -k ПАРОЛЬ > ./file

Параметр -k и пароль можно не указывать, тогда он будет запрошен во время выполнения команды.

Комбинирование (Создание шифрованого архива, разбиение на тома)

Естественно команды можно комбинировать, и к примеру создание архива директории dir со сжатием gzip и шифрованием openssl aes будет выглядеть так:

$ tar -czf - ./dir | openssl enc -e -aes-256-cbc -k ПАРОЛЬ > archive.tar.gz.encoded

Рашифровываем (в обратном порядке):

$ openssl enc -d -aes-256-cbc -in ./archive.tar.gz.encoded | tar -xz

Плюс если шифрованный архив надо разбить на куски - добавляем split, все ограничивается только вашей фантазией :)

$ tar -czf - ./dir | openssl enc -e -aes-256-cbc -k ПАРОЛЬ | split -db 4M - arc

Склеиваем, дешифруем, разжимаем, разворачиваем:

$ cat arc* | openssl enc -d -aes-256-cbc | tar -xzf - 

Источник: http://belgorod.lug.ru/wiki/index.php

Шифрование GPG

GnuPG очень известный способ шифрования и подписи электронных писем или других данных, кроме того gpg предоставляет расширенную систему управления ключами. В данных примерах рассматривается только шифрование файлов
Самым простым является симметричный шифр. В этом случае файл шифруется с помощью пароля, соответственно расшифровать его може тот, кто знает этот пароль, никаких ключей не требуется. Gpg добавляет расширение «*.gpg» к имени зашифрованного файла.

$ gpg -c file                        # Зашифровать файл по паролю
$ gpg file.gpg                       # Расшифровать файл ( -o другой файл) 

Источник: http://vds-admin.ru/content/view/24/28//

Немного о правах в Unix

[announce]Чтобы было понятно и не забыть самому, что значат циферки в правах :)[/announce]
Итак, основы Unix, но я всегда  забываю как формируются цифры прав доступа в Unix, поэтому и решил написать сюда об этом. чтобы в случае  чего можно было подглядеть.

Вот примерная схема:

-r-w-x—r-w-x—r-w-x-
——-   ——-  ———
    U         G         O

Легенда:
U — Владелец файла
G — Группа владельца файла
O — Все остальные

-r- — Разрешение на чтение
-w- -Разрешение на запись
-x- -Разрешение на использование

Теперь о том как формируются цифры:

Каждое разрешение представляет из себя ,если грубо, булевое значение т.е может быть равно 0 (выключено) или  1(включено)
Таким образом получаем двоичный код   -111-111-111- что значит -rwx-rwx-rwx, а как мы знаем  из курса информатики 111 в двоичной системе счисления есть 7 в восьмеричной, значит запись -111-111-111- в двоичной системе счисления будет равна -7-7-7- в восьмеричной. Кажется все логично и просто :)

Нембольшая таблица, чтобы было понятно наглядно.

Доступ Двоичное число Восьмеричное число
000 0
—x 001 1
-w- 010 2
-wx 011 3
r— 100 4
r-x 101 5
rw- 110 6
rwx 111 7

Вот небольшая программка, которую я написал на js. Может кому-нибудь она поможет лучше понять принцип прав доступа в Unix

При написании статьи пользовался книгой — Маслякова В.Г, Linux на 100%(+DVD), СПб.:Питер,2009, 336c.

настройка sudo

[announce]Настраиваем sudo в ARCHLinux..[/announce]
Программа sudo предназначина для запуска команд с привелегиями root пользователя:
например:

$ sudo halt

Для настройки рекомендуеться запустить команду visudo от ползователя root, которая запустит редактор vi с файлом для редактирования — /etc/sudoers

Немного о синтаксисе файла.

Чтобы разрешить пользователю выполнять все команды от root  нужно ввести строку:

  

user ALL=(ALL) ALL

Если нужно дать возможность запускать на машине только несклько команд, то можно искользовать такой синтаксис:

user ALL=/usr/sbin/halt

Эта строка позволит запускать пользователю user команду halt. Для того,  чтобы позволить пользователю запускать несколько  команд от  пользователя root нужно перечислить команды, включая абсолютный путь к команде, через запятую.

user      ALL=/usr/sbin/halt,  /bin/mount

Эта строка позволит запускать от полззователя root команды halt и mount

Итак, примерно получается такой синтаксис как я понял:

первое поле user — имя пользователя от которого будет запускаться команда sudo
второе поле ALL= — это имя машины на которой разрашено запускать каоманды через sudo
третье поле (ALL) — это пользователь от кого будет запущена команда через sudo, по-умолчанию root
четвертое поле — список команд с абсолютным путем к команде.

Еще пара любопытных опций.
Немного юмора от разработчиков sudo. Если в /etc/sudoers есть эта строка, то вместо стандартного сообщения о введенном неверно пароле будет выводиться шутливое предупреждение:

Defaults insults 

Данная строка укажет на то что sudo будет хранить пароль 10мин.

Defaults:ALL timestamp_timeout=10

*Примечание: каждая запись занимает одну строку, поэтому некоторые записи могут быть большими, для переноса можно ипользовать символ \ тобишь как-то так:

user      ALL=/usr/sbin/halt,  \
/bin/mount

Это будет одна строка.

Источники:

$ man sudo
$ man sudoers

http://wiki.archlinux.org/index.php/Sudo_(Русский)
http://wiki.archlinux.org/index.php/Sudo

конечно же :)

Очень странный сайт с какими-то ошибками и неправильной кодировкой (сразу видно НАШ былокодерский! :) ) — http://www.infocity.kiev.ua/os/content/os299_2.phtml 

Поднимаем Samba

[announce]Поднимаем Samba в FreeBSD 8.1[/announce]
Итак, для того, чтобы подружить windows с FreeBSD поднимаем самбу

# cd /usr/ports/net/samba3 && make install clean

Далее добавляем в /etc/rc.conf строку — inetd_enable=»YES»

Запускаем —
# /etc/rc.d/inetd start

Открываем браузер и вводим в адресную строку: <domain_samba_server>:901 где  <domain_samba_server> имя или ip машины на которой запустили самбу, например http://localhost:901 или http://127.0.0.1:901
После ввода пароля и логина можем управлять настройками самбы из браузера.

Проще как мне кажется отредактировать файл /usr/local/etc/smb.conf при помощи любимого текстового редактора ( конечно же vi :) )

После сохранения настроек запускаем Самбу —
/etc/rc.conf — сюда по традиции добавляем строки:

winbindd_enable="YES"
nmbd_enable="YES"
smbd_enable="YES"

И запускаем скрипт запуска самбы:

# /usr/local/etc/rc.d/samba start

 

LAMP для FreeBSD

[announce]Ставим на фрю LAMP ну или тогда уж FAMP ))[/announce]
Нужно поставить Apache+Mysql+php на FreeBSD 8.1, который в народе заветься LAMP я буду назвать FAMP так как в качестве ОС системы буду использовать не Linux а FreeBSD
Вот как делать:

Для начала поставим Apache:*

# cd  /usr/ports/www/apache13 && make install clean

Затем ставим php и mysql

# cd /usr/ports/lang/php5 && make install clean

В меню config выбираем модуль Apache
Ставим mysql

# cd /usr/ports/databases/mysql50-server && make install clean

прописываем в в rc.conf строки для автоматического старта серверов Apache и Mysql:

apache_enable=»YES»
mysql_enable=»YES»

Запускаем:

# /usr/local/etc/rc.d/mysql-server start &
# apachectl start

можно попробовать сделать скрипт типа такого —

# vim install-lamp.sh

#!/bin/sh
cd  /usr/ports/www/apache13 && make install clean
cd /usr/ports/lang/php5 && make install clean
cd /usr/ports/databases/mysql50-server && make install clean
echo ‘apache_enable=»YES»‘ >> /etc/rc.conf
echo ‘mysql_enable=»YES»‘ >> /etc/rc.conf
/usr/local/etc/rc.d/mysql-server start &
apachectl start

Делаем скрипт запускаемым:

# chmod 775 install-lamp.sh

или запускаем так:

# /bin/sh install-lamp.sh

Зупускать нужно из под пользователя root или используя команду sudo

Вот FAMP и готов )))

* примечание: сначала хотел поставить сервер apache22, но возникли ошибки при установки с пакетом db чего-то там.. так как версия сервера для меня была не принципиальна и не очень много желания было ковырять в сторону исправления этой ошибки, я поставил версию 1.3

PS. В процессе установки FreeBSD я по нехватки опыта отметил php и apache для установки из коробки, все поставилось хорошо, вот только php установился не как модуль apache, а отдельно о чем мне после запуска сервера apache, сообщил inpdex.php, который отобразился как текст в браузере :) Мне пришлось удалить все пакеты связанные с php через pkg_delete и затем собрать php из портов с поддержкой модуля для Apache.

Источник информации: http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/network-apache.html
Привожу англоязычную документацию не из-за понтов (с английским у меня не очень..) просто дело в том, что в локализованном хэндбуке вариант настройки и установки не подошёл мне (скорее всего из-за устаревшей информации, которая приводится в русскоязычной документации)

**Пока не поменял владельца /var/db/mysql вот так — chown -R mysql:mysql /var/db/mysql/ mysql скрвер не стартавала (решение подглядел вот тут в комментариях — http://chrv.ru/?p=11)

HTML 5

[announce]Пора переходить[/announce]

Думаю пришло время переходить на html5 в нем достаточно много интересных вещей, пока не совсем понимаю как работает видео плеер на html5, но пока с видео траблы, у меня не запустился плеер html5 в FF, а это уж совсем значит никуда не годиться.

Вот что новенького появилось (движение в сторону упрощения, что не может не радовать :) ):

  • Логическая разбивка (header, footer, nav …) и это есть прикольно! :)
  • Доктайп стал очень простым — !DOCTYPE html
  • У ссылок можно использовать атрибут — target
  • Тэг script может не содержать никакие атрибуты
  •  

    В IE чтобы вся эта красота заработала нужно вставить небольшой код javascript в документе на HTML5:

    Так:

    <!-- [if IE] -->
    <script>
    document.createElement('header');
    document.createElement('nav');
    document.createElement('section');
    document.createElement('article');
    document.createElement('aside');
    document.createElement('footer');
    </script>
    <!-- [endif]-->
    

    Или так:

    <!--[if IE]>
      <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    

     

    Конечно я уже привык к XHTML и мне даже нравилась его строгость, но ничего не поделаешь, время идет и приходят новые более совершенные технологии. :-D

    Я прочитал из этого ресураса о html5 http://dimox.name/hello-html5-goodbye-xhtml2/

FreeBSD

[announce]Ставлю и кручу фряку (очень увлекательно :) ) Подробности читайте в http://killercoder.ru/zennix/ [/announce]

666666666666666666666666666666666666666666666666626666666666666666666666666666666666666666666666666666666666666666666666
6666666666666666666666666666666666666666666
6624 4666666666666666666666666666666666666666666666666666666666666666666666
66666666666666666666666666666666666666666
62445 466666666666666666666666666666662222666666666666666666666666666666666666
66666666666666666666666666666666666666
6244225 56666666666666666666666666666666666524 42666666666666666666666666666666666
666666666666666666666666666666666666
6244224 4666666666666666666666666666666666666424 466666666666666666666666666666666
6666666666666666666666666666666666
62422224 466666666666666666666666666666666666666425 2666666666666666666666666666666
666666666666666666666666666666666
622222225 56662224455 554226666666666666666422 466666666666666666666666666666
66666666666666666666666666666666
642222224 5 42222455 5426666666666664225 46666666666666666666666666666
66666666666666666666666666666666
222222225555555542225555 526666666624225 2666666666666666666666666666
66666666666666666666666666666666
52222245422244222224222225 566622454222 5666666666666666666666666666
66666666666666666666666666666666
4222254224422252222444442225 5544442222225 666666666666666666666666666
66666666666666666666666666666666
22225424266662522426666254225 55555 5222222222225 5666666666666666666666666666
66666666666666666666666666666666
64254446666665222666666625222244555 542222222455 2666666666666666666666666666
666666666666666666666666666666666
45442666666422266666666625222225 544445 26666666666666666666666666666
666666666666666666666666666666666
4542666666242666666666662 2222245 5266666666666666666666666666666
66666666666666666666666666666666
65426224266422666666666666542222255 526666666666666666666666666666666
66666666666666666666666666666666
2542465 5644 52 5266666666542222254 52666666666666666666666666666666666
66666666666666666666666666666666
5455 5 524 22 66666662522222224 4266666666666666666666666666666666666
666666666666666666666666666666
62525 44 55 26666662522222224 4266666666666666666666666666666666666666
66666666666666666666666666666
2242225 425 26666665422222225 26666666666666666666666666666666666666666
666666666666666666666666666
6242222244444424 56666665522222222 56666666666666666666666666666666666666666
66666666666666666
6666666666242222242222222245 466666655222222224 46666666666666666666666666666666666666666
66666666666666666
6222266666522222242222222245555222244555422224555 26666666666666666666666666666666666666666
666666666666666666
6222222662422222444222224 522222222222222225 466666666666666666666666666666666666666666
6666666666666
666666622422266222222224555555555422222222222222225 5666666666666666666666666666666666666666666
6666666666666
222266662662226624222555222222222222222222222222225 46666666666666666666666666666666666666666666
6666666666666
622224266666222666244445 4222222222222222245 555 266666666666666666666666666666666666666666666
66666666666666
642222222622246666662245 542222222222455 554445 26666666666666666666666666666666666666666666666
6666
622666666666666222222242666666666624 5555555 542222445 52666666666666666666666666666666666666666666666666
66666
62222222666666622222222662222224266622555444422224455 466666666666666666666666666666666666666666666666666
6666666
662222222222222222222252222225 466666625 55555 266666666666666666666666666666666666666666666666666
6666666666
6222222222226666242542224 566666662224444422222222244 266666666666666666666666666666666666666666666666666
6666666666666
666666666666662444445 54222666242222222222222222225 26666666666666666666666666666666666666666666666666
66666666666666666666666666
242222225 422222222222222222225 2666666666666666666666666666666666666666666666666
66666666666666666666666666
422222225 544444444422222224 525 5666666666666666666666666666666666666666666666666
66666666666666666666666666
62244445 522222222245555455 525 266666666666666666666666666666666666666666666666
6666666666666666666666666666
62555444 422222222222455 24 466666666666666666666666666666666666666666666666
666666666666666666666666666666
6224445 4222222222222225 566666666666666666666666666666666666666666666666
666666666666666666666666666666666666
625 54222222222222455 566666666666666666666666666666666666666666666666
66666666666666666666666666666666666666
6 5442222222244 466666666666666666666666666666666666666666666666
666666666666666666666666666666666666666
65 5 5555 5666666666666666666666666666666666666666666666666
666666666666666666666666666666666666666
645 2666666666666666666666666666666666666666666666666
666666666666666666666666666666666666666
222255 5666666666666666666666666666666666666666666666666
666666666666666666666666666666666666666
422222245 522245 266666666666666666666666666666666666666666666666
666666666666666666666666666666666666666
242222222224555 54222445 66666666666666666666666666666666666666666666666
666666666666666666666666666666666666666
6442222222222224 542225 56666666666666666666666666666666666666666666666
66666666666666666666666666666666666666666
25222222222224 55 5266666666666666666666666666666666666666666666
666666666666666666666666666666666666666666
2 5554444455 46666666666666666666666666666666666666666666
666666666666666666666666666666666666666666
2 5 526666666666666666666666666666666666666666
666666666666666666666666666666666666666666
65522245 555 5 5426666666666666666666666666666666666666
6666666666666666666666666666666666666666
662452224455 5444444 55 5 2624 542266666666666666666666666666666666
666666666666666666666666
66666662222222244452224244 5422455 445 26662245 544226666666666666666666666666
66666666666666666
66666666266625 422445444554555555555 56666666622255 5544422266666666666666
66666666666666
66666666666666662 5 542222622224 5442555555 266666666666666222455 554266666666
66666666666666
2666666666666666222666666666666625 422445 6666666666666666666666662222222244555 5466666
66666666666666
2666666666666252666666666666666662 56666666666666666666666666666666666662244 4666
666666666666666
62222666666645266666666622222224 5426666666666666666666666666666252666666666245 466
6666666666666666666
6666666666666666666666666625 542266666666666666666666666666666244445266666624 266
6666666666666666666666666666666
666666622222225 555544222666666666666666666666666666666662244222224 44555 46666
66666666666666666666666666666666666666666
6666666666666666666666666666666666666666666666622442222222225 55426666666
66666666666666666666666666666666666666666666666666666666666666666666666666666666666
6624444444455555 5266666666666666
6666666666666666666666666666666666666666666666666666666666666666666666666666666666
62222222222266666666666666666666666666
666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666

Ставлю и кручу фряку (очень увлекательно :) ) Подробности читайте в http://killercoder.ru/zennix/

ASCII стянул отсюда — http://www.codeismylife.com/ascii_freebsd_daemon/3223.html

Пересборка Мира и ядра

[announce]Пересобрал мир и ядро на только что установленной фряке. Вот как было дело:[/announce]
После установки Фряки мне пришла в голову мысль, что неплохо было бы персобрать мир и ядро системы.
Дальше опишу свои действия и команды, а так же укажу источники информации, которыми я пользовался в процессе.

Итак, приступим

Для оптимизации компиляции нужно отредактировать /etc/make.conf
Пример make.conf можно найти в /usr/share/examples/make.conf
У меня получился вот так — http://killercoder.ru/zennix/Nastroyka_make_conf_v_FreeBSD

Обновляемся через cvsup как тут — http://killercoder.ru/zennix/Obnovlenie_ishodnikov_cherez_cvsup

Читаем тут — http://www.freebsd.org/doc/ru/books/handbook/makeworld.html

Загружаемся в однопользовательский режим:
После загрузки вводим:

# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a

Переходим в директорию с исходниками (у меня /usr/src/)

# cd /usr/src/

На этапе выбора архитектуры мира произошла накладка, дело в том что uname -a возвратил мне i386, а
dmesg | grep CPU — Athlon64 :)

Нужно было безболезненно перейти на другую архитектуру так как make buildkernel отказался запускаться с параметром в файле конфигурации ядра cpu HAMMER — это для 64х битных атлонов.
Google нашёл по этому поводу статью вот она — http://unixfaq.ru/index.pl?req=qs&id=527

Учитывая данные сведения сделал:

# make buildworld TARGET_ARCH = amd64

Сборка, запустилась. Я не очень силён в команде make, но кажется можно было бы запустить и с параметром -j4, а для amd64 возможно и -j8 для увеличения производительности и скорости сборки.

Дальше переходим 
Копируем ядро GENERIC для нужной нам платформы в удобное место в данном случае это ~/ # cp /usr/src/sys/amd64/conf/GENERIC ~/KERNEL_`date %d_%m_%Y`  Идею с именем нового ядра подсказал lissyara вот отсюда — http://www.lissyara.su/articles/freebsd/tuning/make_kernel/

Редактируем опции ядра при помощи любимого редактора, в моем случае это vi :)

# vi  KERNEL_01_07_2010

Свой конф приводить думаю бессмысленно, могу только сказать, что ознакомится с дополнительными параметрами ядра можно в файле /usr/src/sys/amd64/conf/NOTES и в /usr/src/sys/NOTES — это если вы понимаете по-английски :) я же пользовался опять же Гуглом и http://www.freebsd.org/doc/ru/books/handbook/kernelconfig-config.html,

Собираем ядро
При сборки ядра make buildkernel TARGET_ARCH=amd64 KERNCONF=KERNEL_01_07_2010 выдал ошибку, после перезагрузки компьютера, я повторил попытку, но команда не сработала, тогда я решил пересобрать ядро с командой

# make buildkernel TARGET_ARCH=amd64

Эта команда прошла и запустилась компиляция ядра.
После компиляции запустил установку нового ядра и make выдал ошибку

Error: Please set DESTDIR

Установил DESTDIR:

# export DESTDIR=/usr/src/

Запустил
# make installkernel TARGET_ARCH=amd64

Вроде пошла установка, но выскачела опять ошибка:

cd: can’t cd to /usr/obj/amd64/usr/sys/GENERIC

Обновление исходников через cvsup

[announce]О том как я обновлял исходники фряки через cvsup[/announce]
Ставим cvsup из портов:

# cd /usr/ports/net/cvsup/ && make install clean

Тоже самое без возможности поддержки иксов —
# cd /usr/ports/net/cvsup-without-gui && make install clean

Создаем файл с настройками обновления:
# vi supfile

В файле:

*default release=cvs tag=.tag=RELENG_8                     # Версия системы, которая нам нужна
*default host=cvsup2.ru.FreeBSD.org                            # Хост откуда тянем исходники
*default prefix=/usr                                                        # Куда кладем полученные исходники (этой строкой в /usr/src/)
*default base=/var/db                                                   # Путь к base каталогу для файлов статуса
*default release=cvs delete use-rel-suffix compress     # Дополнительные опции
src-all                                                                             # Забираем все исходники

Запускаем cvsup -g -L 2 supfile

Читаем внимательно:
http://www.freebsd.org/doc/ru/books/handbook/cvsup.html

Настройка make.conf в FreeBSD

[announce]Решил завести себе домашний сервер под FreeBSD. Первое, что решил сделать после установки — оптимизировать опции сборки.[/announce]
Вот мой /etc/make.conf:

CPUTYPE?=athlon64 # Процессор
CFLAGS=-01 -pipe # Флаги сборки
NO_PROFILE=true #Обход построения библиотек для профилирования

# Включать флаги обязательно
NO_CPU_CFLAGS=false
NO_CPU_COPTFLAGS=false

# Отключаем сборку ненужных пакетов
MAKE_KERBEROS4=false
MAKE_KERBEROS5=false
NO_BIND=true
NO_SENDMAIL=true
NO_GAMES=true

# Язык документаций
DOC_LANGS=en_US.ISO8859-1 ru_RU.KOI8-R

Источники информации:
http://www.lissyara.su/articles/freebsd/tuning/make.conf/
http://www.freebsd.org/doc/ru/books/handbook/
/usr/share/examples/etc/make.conf

Отрывок из книге Ф.Г. Углова — «В ПЛЕНУ ИЛЛЮЗИЙ»

[announce]Нашел интересный отрывок из книге Ф.Г. Углова — «В ПЛЕНУ ИЛЛЮЗИЙ». Вообще если будет время и желание обязательно напишу об этом человеке, а пока хочу представить отрывок из его книге для тех людей которые попали под промывку мозгов о том, что пьянство — э[/announce]

Нашел интересный отрывок из книге Ф.Г. Углова — В ПЛЕНУ ИЛЛЮЗИЙ». Вообще если будет время и желание обязательно напишу об этом человеке, а пока хочу представить отрывок из его книге для тех людей которые попали под промывку мозгов о том, что пьянство — это то что в России было всегда и естественно для нашей Родины. ( в числе тех кому промыли мозги по поводу истории употребления алкоголя у нас в стране оказался и я сам, поэтому собсвенно меня и заинтересовали подобные факты из книге )

 

 

Отрывок из книге Ф.Г. Углова — «В ПЛЕНУ ИЛЛЮЗИЙ»

Сегодня нередко встречаешься с высказываниями, будто потребление алкогольных напитков имело место всегда, что жизнь человеческого общества немыслима без вина, поэтому, мол, незачем вести борьбу с этой привычкой и нет оснований людям от нее отказываться.

 

Что можно сказать по этому поводу?

 

Прежде всего надо уточнить, что не все человечество и далеко не всегда употребляло спиртное. Сотни миллионов магометан почти тысячелетие совсем не употребляют вина и ничего, кроме хорошего, от этого не видят. Кроме того, известно также, что в течение веков употреблялись лишь слабые напитки типа браги, пива, медовухи и т. д., которые приготовлялись кустарно и не в таких массовых масштабах, чтобы удовлетворить всех. Пили только более обеспеченные. Основная же масса людей не имела возможности даже думать о вине. Они думали о хлебе, о том, чтобы не умереть с голоду.

 

Западные русофобы усердствуют в доказательстве того, что у русских, мол, особая склонность к спиртным напиткам. Отголоски этой точки зрения нет-нет да и встретятся в нашей литературе. В связи с этим мне хотелось бы кратко коснуться истории данного вопроса.

 

Объективное и непредвзятое изучение истории потребления спиртных напитков в России показывает, что издревле наши люди пили редко, мало и только слабые напитки домашнего производства.

 

В течение многих веков наш народ, истекая кровью, вел круговую оборону, отстаивая свою независимость. По 40-50 лет в столетие он находился в состоянии войны, и мирная жизнь была для него лишь короткой передышкой. В целом для России XIII-XVIII веков состояние мира было скорее исключением, а война — жестоким правилом. Воевать приходилось и на северо-западе, и на западе, и на южных, юго-восточных и восточных границах. В таких условиях требовалось невиданное напряжение сил всего народа, и именно поэтому в нашей стране намного позднее других стран потребление спиртных напитков получает широкое распространение.

 

Утверждение о том, что потребление опьяняющих напитков известно давно, верно, однако никогда это потребление не достигало таких размеров, как в последние два столетия, ибо до этого времени хмельные напитки изготовлялись в слабой концентрации, кустарно. Фабричное производство чистого спирта, а вместе с ним и потребление крепких напитков, получило широкое распространение лишь с начала 19-го столетия. Последнее обстоятельство и оказало огромное влияние на степень и быстроту распространения пьянства во всем мире и в нашей стране.

 

Вскоре после начала заводского изготовления спирта алкоголь стал одним из важных способов наживы, так как потребность в нем как в наркотике нарастала, а его Производство с ростом техники становилось все более доступным и дешевым. Появилась целая армия виноделов и виноторговцев, которые, используя свойства алкоголя, в том числе свойство легкого привыкания к нему людей, превратили виноторговлю в один из самых отвратительных способов ограбления трудящихся. В условиях антагонистически классового общества промышленное производство и торговля спиртным явились, по существу, двойной эксплуатацией людей — экономической и психической. Человек, привыкая к спиртному, бКатарактаыстро попадает в зависимость от него, теряет чувство самостоятельности и собственного достоинства, у него становится дряблой и слабой воля, он легче поддается влияниюнравственно обезличенных людей…

Скачать книгку можно тут

Подключение tinymce

[announce]Постоянно забываю как подключать его.. Пусть будет здесь![/announce]
Подключение TinyMCE к textarea по классу

tinyMCE.init({	
...
mode : "specific_textareas",
editor_selector : "mceEditor"
});

Подключение TinyMCE к textarea по ID

tinyMCE.init({
...
mode : "exact",
elements : "elm1,elm2"
});

...

<textarea id="elm1" ...

Источник: http://wiki.moxiecode.com/index.php/TinyMCE:Configuration/mode

Интерпретатор командного языка shell

[announce]Пусть будет и тут в помощь быдлокодерам %)[/announce]


Shell - командный язык, могущий выполнять как команды,
введенные с терминала, так и команды, хранящиеся в файле.


Этот текст подготовлен НПО "КЛОТО"

Оглавление

1. Основные понятия языка shell . . . . . . . . . . . . . .
1_1. Ввод-вывод . . . . . . . . . . . . . . . . . . . . . .
1_2. Синхронное и асинхронное выполнение команд . . . . . .
1_3. Конвейер . . . . . . . . . . . . . . . . . . . . . . .
1_4. Метасимволы, генерация имен файлов . . . . . . . . . .

2_ Синтаксис языка shell . . . . . . . . . . . . . . . . .
2_1. Комментарии . . . . . . . . . . . . . . . . . . . . .
2_2. Подстановка результатов выполнения команд . . . . . .
2_3. Переменные и подстановка их значений . . . . . . . . .
2_4. Специальные переменные . . . . . . . . . . . . . . . .

3_ Управляющие конструкции . . . . . . . . . . . . . . . .
3_1. Цикл ДЛЯ . . . . . . . . . . . . . . . . . . . . . . .
3_2. Оператор выбора . . . . . . . . . . . . . . . . . . .
3_3. Условный оператор . . . . . . . . . . . . . . . . . .
3_4. Цикл ПОКА . . . . . . . . . . . . . . . . . . . . . .
3_5. Функции . . . . . . . . . . . . . . . . . . . . . . .
3_6. Зарезервированные слова . . . . . . . . . . . . . . .
3_7. Специальные команды . . . . . . . . . . . . . . . . .

4_ Выполнение shell-программ . . . . . . . . . . . . . . .
4_1. Запуск shellа . . . . . . . . . . . . . . . . . . . .
4_2. Выполнение . . . . . . . . . . . . . . . . . . . . . .
4_3. Окружение . . . . . . . . . . . . . . . . . . . . . .
4_4. Сигналы . . . . . . . . . . . . . . . . . . . . . . .
4_5. Замечания . . . . . . . . . . . . . . . . . . . . . .

5_ Дополнительные сведения . . . . . . . . . . . . . . . .
5_1. Команда test . . . . . . . . . . . . . . . . . . . . .
5_2. Команда expr . . . . . . . . . . . . . . . . . . . . .
5_3. Команда ena . . . . . . . . . . . . . . . . . . . . .

    * 1. Основные понятия языка shell *



    1_1. Ввод-вывод



Три направления ввода-вывода являются выделенными - стан-
дартный ввод, стандартный вывод и стандартный протокол. Как
правило, команды берут исходные данные из стандартного ввода и
помещают результаты в стандартный вывод.
Стандартные ввод, вывод и протокол можно переназначить.
Обозначение

< <имя файла>

служит для переназначения стандартного ввода (дескриптор файла
0),

> <имя файла>

для стандартного вывода (дескриптор файла 1);

<< <строка>

ввод происходит со стандартного ввода, пока не встретится ука-
занная <строка> или конец файла,

>> <имя файла>

для стандартного вывода; если файл существует, то выводимая ин-
формация добавляется к конец этого файла,

<& <цифра>

в качестве стандартного ввода объявляется файл, ассоциированный
с дескриптором <цифра>; аналогично для стандартного вывода

>& <цифра>

<&- и >&-

закрывают соответственно стандартный ввод и вывод.
Если любой из этих конструкций предшествует цифра, то с
указанным файлом будет ассоциирован дескриптор, равный указан-
ной цифре, вместо 0 и 1 по умолчанию. Например,

2 > <имя файла>

для стандартного протокола используется дескриптор 2, а

2 >& 1

ассоциирует дескриптор 2 с файлом, ассоциированным с дескрипто-
ром 1.

... 2>protocol
переназначает стандартный протокол (дескриптор 2) в файл по
имени protocol.

Чтобы переназначить стандартный протокол туда же, куда уже наз-
начен стандартный вывод, следует употребить конструкцию
Ў... 2>&1

Важен порядок переназначения: shell производит переназна-
чение слева направо по указанному списку. Так,

1 > xxx 2 >& 1

сначала ассоциирует дескриптор 1 с файлом xxx, а затем дескрип-
тор 2 с 1, т.е. тоже с xxx. А

2 >& 1 1 > xxx

ассоциирует дескриптор 2 с терминалом, а 1 - с файлом xxx.

Можно переназначить системный ввод на текущий файл:

isql - - <

1_2. Синхронное и асинхронное выполнение команд



Обычно shell ждет завершения выполнения команды. Однако
имеется возможность запустить задачу в асинхронном режиме, т.е.
без ожидания ее завершения. Для этого после команды (после всех
ее аргументов и указаний о переназначении ввода-вывода) надо
поставить знак &. При этом по умолчанию стандартный ввод коман-
ды назначается на пустой файл /dev/null.

Пример: создать файл primer можно по команде

echo > primer

Еще пример: запустить программу prog в асинхронном режиме, что-
бы не надо было дожидаться его завершения, засечь время выпол-
нения, результаты программы направить в файл prog.res, данные о
времени выполнения - в файл prog.tim.

time prog > prog.res 2> prog.tim &

    1_3. Конвейер



Конвейер - последовательность команд, разделенных знаком |.
Если после конвейера стоит ; shell ждет его завершения. Если &
- то не ждет. Роль ; может играть конец строки. Смысл конвейера
в том, что стандартный вывод одной команды замыкается на стан-
дартный ввод другой. Пример конвейера - подсчитать число объ-
ектных файлов в текущем каталоге.

ls *.o | wc -l

    1_4. Метасимволы, генерация имен файлов



Метасимволы - символы, имеющие специальное значение для
интерпретатора :

? * ; & ( ) | ^ < > <пробел> <табуляция> <возврат_каретки>

Однако каждый из этих символов может представлять самого себя,
если перед ним стоит \. Все символы, заключенные между кавычка-
ми ' и ', представляют самих себя. Между двойными кавычками (")
выполняются подстановки команд (см п. 2.2) и параметров (см. п.
2.3), а символы \, `," и $ могут экранироваться предшествующим
символом \.
После всех подстановок в каждом слове команды ищутся сим-
волы *,?, и [. Если находится хотя бы один из них, то это слово
рассматривается как шаблон имен файлов и заменяется именами
файлов, удовлетворяющих данному шаблону (в алфавитном порядке).
Если ни одно имя файла не удовлетворяет шаблону, то он остается
неизменным. Значения указанных символов:
* любая строка, включая и пустую
? один любой символ
[...] любой из указанных между ними символов. Пара
символов, разделенных знаком -, означает любой
символ, который находится между ними, включая и
их самих. Если первым символом после "[" идет
"!", то указанные символы не должны входить в
имя файла

    * 2_ Синтаксис языка shell *



    2_1. Комментарии


Строки, начинающиеся с #, трактуются как комментарии.

    2_2. Подстановка результатов выполнения команд



Выражения можно заключать в обратные кавычки (`). Такие
выражения вычисляются в месте использования. Они могут быть,
например, частью строк. Пример. Пусть параметром макрокоманды
является имя файла с расширением .for. Требуется удалить однои-
менный файл с расширением .err.

name=`ena -n $1`
rm -f ${name}.err

Значение, полученное в результате выполнения команды

ena -n $1

присваивается переменной name. Фигурные скобки использованы для
выделения аргумента операции перехода от имени к значению. Без
них .err приклеилась бы к имени.

    2_3. Переменные и подстановка их значений



Все переменные в языке shell - текстовые. Их имена должны
начинаться с буквы и состоять из латинских букв, цифр и знака
подчеркивания (_). Чтобы воспользоватся значением переменной,
надо перед ней поставить символ $. Использование значения пере-
менной называется подстановкой.
Различается два класса переменных: позиционные и с именем.
Позиционные переменные - это аргументы командных файлов, их
именами служат цифры: $0 - имя команды, $1 - первый аргумент и
т.д. Значения позиционным переменным могут быть присвоены и ко-
мандой set (см. Специальные команды). Пример. После вызова
программы на shellе, хранящейся в файле ficofl:

ficofl -d / \*.for

значением $0 будет ficofl, $1 - -d, $2 - /, $3 - *.for, значе-
ния остальных позиционных переменных будут пустыми строками.
Заметим, что если бы символ * при вызове ficofl не был экрани-
рован, в качестве аргументов передались бы имена всех фортран-
ных файлов текущей директории.
Еще две переменные хранят командную строку за исключением
имени команды: $@ эквивалентно $1 $2 ..., а $* - "$1 $2 ...".
Начальные значения переменным с именем могут быть установ-
лены следующим образом:

<имя>=<значение> [ <имя>=<значение> ] ...

Не может быть одновременно функции (см. Управляющие конструк-
ции) и переменной с одинаковыми именами.
Для подстановки значений переменных возможны также следую-
щие конструкции:

${<переменная>}

если значение <переменной> определено, то оно подставляется.
Скобки применяются лишь если за <переменной> следует символ,
который без скобок приклеится к имени.

${<переменная>:-<слово>}

если <переменная> определена и не является пустой строкой, то
подставляется ее значение; иначе подставляется <слово>.

${<переменная>:=<слово>}

если <переменная> не определена или является пустой строкой, ей
присваивается значение <слово>; после этого подставляется ее
значение.

${<переменная>:?<слово>}

если <переменная> определена и не является пустой строкой, то
подставляется ее значение; иначе на стандартный вывод выводится
<слово> и выполнение shellа завершается. Если <слово> опущено,
то выдается сообщение "parameter null or not set".

${<переменная>:+<слово>}

если <переменная> определена и не является пустой строкой, то
подставляется <слово>; иначе подставляется пустая строка.

Пример: если переменная d не определена или является пус-
той строкой, то выполняется команда pwd

echo ${d:-`pwd`}

Следующие переменные автоматически устанавливаются shellом:

# количество позиционных параметров (десятичное)
- флаги, указанные при запуске shellа или коман-
дой set
? десятичное значение, возвращенное предыдущей
синхронно выполненной командой
$ номер текущего процесса
! номер последнего асинхронного процесса
@ эквивалентно $1 $2 $3 ...
* эквивалентно "$1 $2 $3 ..."

Напомним: чтобы получить значения этих переменных, перед ними
нужно поставить знак $. Пример: выдать номер текущего процесса:

echo $$

    2_4. Специальные переменные



Shellом используются следующие специальные переменные:

HOME директория, в которую пользователь попадает при
входе в систему или при выполнении команды cd
без аргументов
PATH список полных имен каталогов, в которых ищется
файл при указании его неполного имени.
PS1 основная строка приглашения (по умолчанию $)
PS2 дополнительная строка приглашения (по умолчанию
>); в интерактивном режиме перед вводом команды
shellом выводится основная строка приглашения.
Если нажата клавиша new_line, но для завершения
команды требуется дальнейший ввод, то выводится
дополнительная строка приглашения
IFS последовательность символов, являющихся разде-
лителями в командной строке (по умолчанию это
<пробел>, <табуляция> и <возврат_каретки>)

    * 3_ Управляющие конструкции *



Простая команда - это последовательность слов, разделенная
пробелами. Первое слово является именем команды, которая будет
выполняться, а остальные будут переданы ей как аргументы. Имя
команды передается ей как аргумент номер 0 (т.е. имя команды
является значением $0). Значение, возвращаемое простой командой
- это ее статус завершения, если она завершилась нормально, или
(восьмеричное) 200+статус, если она завершилась аварийно.
Список - это последовательность одного или нескольких кон-
вейеров, разделенных символами ;, &, && или || и быть может за-
канчивающаяся символом ; или &. Из четырех указанных операций ;
и & имеют равные приоритеты, меньшие, чем у && и ||. Приоритеты
последних также равны между собой. Символ ; означает, что кон-
вейеры будут выполняться последовательно, а & - параллельно.
Операция && (||) означает, что список, следующий за ней будет
выполняться лишь в том случае, если код завершения предыдущего
конвейера нулевой (ненулевой).
Команда - это либо простая команда, либо одна из управляю-
щих конструкций. Кодом завершения команды является код заверше-
ния ее последней простой команды.

    3_1. Цикл ДЛЯ



for <переменная> [ in <набор> ]
do
<список>
done

Если часть in <набор> опущена, то это означает in "$@" ( то
есть in $1 $2 ... $n). Пример. Вывести на экран все фортранные
файлы текущей библиотеки:

for f in *.for
do
cat $f
done

    3_2. Оператор выбора



case $<переменная> in
<шаблон> | <шаблон>... ) <список> ;;
. . .
esac

Оператор выбора выполняет <список>, соответствующий первому
<шаблону>, которому удовлетворяет <переменная>. Форма шаблона
та же, что и используемая для генерации имен файлов. Часть
| шаблон... может отсутствовать.

Пример. Определить флаги и откомпилировать все указанные файлы.

# инициализировать флаг
flag=

# повторять для каждого аргумента
for a
do
case $a in

# объединить флаги, разделив их пробелами
-[ocSO]) flag=$flag' ' $a ;;
-*) echo 'unknown flag $a' ;;

# компилировать каждый исходный файл и сбросить флаги
*.c) cc $flag $a; flag= ;;
*.s) as $flag $a; flag= ;;
*.f) f77 $flag $a; flag= ;;

# неверный аргумент
*) echo 'unexpected argument $a' ;;
esac
done

    3_3. Условный оператор.



if <список1>
then
<список2>
[ elif <список3>
then
<список4> ]
. . .
[ else
<список5> ]
fi

Выполняется <список1> и, если код его завершения 0, то выполня-
ется <список2>, иначе - <список3> и, если и его код завершения
0, то выполняется <список4>. Если же это не так, то выполняется
<список5>. Части elif и else могут отсутствовать.

    3_4. Цикл ПОКА



while <список1>
do
<список2>
done

До тех пор, пока код завершения последней команды <списка1>
есть 0, выполняются команды <списка2>.
При замене служебного слова while на until условие выхода
из цикла меняется на противоположное.
В качестве одной из команд <списка1> может быть команда
true (false). По этой команде не выполняется никаких действий,
а код завершения устанавливается 0 (-1). Эти команды применяют-
ся для организации бесконечных циклов. Выход из такого цикла
можно осуществить лишь по команде break (см. Специальные коман-
ды).

    3_5. Функции



<имя> () {
<список>;
}

Определяется функция с именем <имя>. Тело функции - <список>,
заключенный между { и }.

    3_6. Зарезервированные слова



Следующие слова являются зарезервированными:

if then else elif fi
case in esac
for while until do done
{ }

    3_7. Специальные команды



Как правило, для выполнения каждой команды shell порождает
отдельный процесс. Специальные команды отличаются тем, что они
встроены в shell и выполняются в рамках текущего процесса.

: Пустая команда. Возвращает нулевой код заверше-
ния.
. file Shell читает и выполняет команды из файла file,
затем завершается; при поиске file используется
список поиска $PATH.
break [n] Выход из внутреннего for или while цикла; если
указано n, то выход из n внутренних циклов.
continue [n] Перейти к следующей итерации внутреннего for
или while цикла; если указано n, то переход к
следующей итерации n-ого цикла.
cd [ <аргумент> ]
Сменить текущую директорию на директорию <аргу-
мент>. По умолчанию используется значение HOME.
echo [ <арг> ... ]
Выводит свои аргументы в стандартный вывод,
разделяя их пробелами.
eval [ <арг> ... ]
Аргументы читаются, как если бы они поступали
из стандартного ввода и рассматриваются как ко-
манды, которые тут же и выполняются.
exec [ <арг> ... ]
Аргументы рассматриваются как команды shellа и
тут же выполняются, но при этом не создается
нового процесса. В качестве аргументов могут
быть указаны направления ввода-вывода и, если
нет никаких других аргументов, то будет измене-
но лишь направление ввода-вывода текущей прог-
раммы.
exit [ n ] Завершение выполнения shellа с кодом завершения
n. Если n опущено, то кодом завершения будет
код завершения последней выполненной команды
(конец файла также приводит к завершению выпол-
нения).
export [ <переменная> ... ]
Данные переменные отмечаются для автоматическо-
го экспорта в окружение (см. Окружение) выпол-
няемых команд. Если аргументы не указаны, то
выводится список всех экспортируемых перемен-
ных. Имена функций не могут экспортироваться.
hash [ -r ] [ <команда> ... ]
Для каждой из указанных команд определяется
и запоминается путь поиска. Опция -r удаляет
все запомненные данные. Если не указан ни один
аргумент, то выводится информация о запомненных
командах: hits - количество обращений shellа к
данной команде; cost - объем работы для обнару-
жения команды в списке поиска; command - полное
имя команды. В некоторых ситуациях происходит
перевычисление запомненных данных, что отмеча-
ется значком * в поле hits.
pwd Выводит имя текущей директории.
read [ <переменная> ... ]
Читается из стандартного ввода одна строка;
первое ее слово присваивается первой перемен-
ной, второе - второй и т.д., причем все остав-
шиеся слова присваиваются последней перемен-
ной.
readonly [ <переменная> ... ]
Запрещается изменение значений указанных пере-
менных. Если аргумент не указан , то выводится
информация обо всех переменных типа readonly.
return [ n ] Выход из функции с кодом завершения n. Если n
опущено, то кодом завершения будет код заверше-
ния последней выполненной команды.
set [ --aefkntuvx [ <арг> ... ] ]
Команда устанавливает следующие режимы:

-a отметить переменные, которые были изменены или
созданы, как переменные окружения (см. Окруже-
ние)
-e если код завершения команды ненулевой, то не-
медленно завершить выполнение shellа
-f запретить генерацию имен файлов
-k все переменные с именем помещаются в окружение
команды, а не только те, что предшествуют имени
команды (см. Окружение)
-n читать команды, но не выполнять их
-t завершение shellа после ввода и выполнения од-
ной команды
-u при подстановке рассматривать неустановленные
переменные как ошибки
-v вывести вводимые строки сразу после их ввода
-x вывести команды и их аргументы перед их выпол-
нением
-- не изменяет флаги, полезен для присваивания по-
зиционным переменным новых значений.

При указании + вместо - каждый из флагов уста-
навливает противоположный режим. Набор текущих
флагов есть значение переменной $-. <арг> - это
значения, которые будут присвоены позиционным
переменным $1, $2 и т.д. Если все аргументы
опущены, выводятся значения всех переменных.

shift [ n ] Позиционные переменные, начиная с $(n+1), пере-
именовываются в $1 и т.д. По умолчанию n=1.
test вычисляет условные выражения (см. Дополнитель-
ные сведения. Test )
trap [ <арг> ] [ n ] ...
Команда <арг> будет выполнена, когда shell по-
лучит сигнал n (см. Сигналы). (Надо заметить,
что <арг> проверяется при установке прерывания
и при получении сигнала). Команды выполняются
по порядку номеров сигналов. Любая попытка ус-
тановить сигнал, игнорируемый данным процессом,
не обрабатывается. Попытка прерывания по сигна-
лу 11 (segmentation violation) приводит к ошиб-
ке. Если <арг> опущен, то все прерывания уста-
навливаются в их начальные значения. Если <арг>
есть пустая строка, то этот сигнал игнорируется
shellом и вызываемыми им программами. Если n=0,
то <арг> выполняется при выходе из shellа. Trap
без аргументов выводит список команд, связанных
с каждым сигналом.
type [ <имя> ... ]
Для каждого имени показывает, как оно будет ин-
терпретироваться при использовании в качестве
имени команды: как внутренняя команда shellа,
как имя файла или же такого файла нет вообще.
ulimit [ -f ] [ n ]
Устанавливает размер файла в n блоков; -f - ус-
танавливает размер файла, который может быть
записан процессом-потомком (читать можно любые
файлы). Без аргументов - выводит текущий раз-
мер.
umask [ nnn ] Пользовательская маска создания файлов изменя-
ется на nnn. Если nnn опущено, то выводится те-
кущее значение маски. Пример: после команды
umask 755
будут создаваться файлы, которые владелец смо-
жет читать, писать и выполнять, а все остальные
- только читать и выполнять.
unset [ <имя> ... ]
Для каждого имени удаляет соответствующую пере-
менную или функцию. Переменные PATH, PS1, PS2 и
IFS не могут быть удалены.
wait [ n ] Ждет завершения указанного процесса и выводит
код его завершения. Если n не указано, то ожи-
дается завершения всех активных процессов-по-
томков и возвращается код завершения 0.

    * 4_ Выполнение shell-программ *



    4_1. Запуск shellа



Программа, интерпретирующая shell-программы, находится в
файле /bin/sh. При запуске ее первый аргумент является именем
shell-программы, остальные передаются как позициональные пара-
метры. Если файл, содержащий shell-программу, имеет право вы-
полнения (x), то достаточно указания лишь его имени. Например,
следующие две команды операционной системы эквивалентны (если
файл ficofl обладает указанным правом и на самом деле содержит
shell-программу):

sh ficofl -d . g\*
и
ficofl -d . g\*

    4_2. Выполнение



При выполнении shell-программ выполняются все подстановки.
Если имя команды совпадает с именем специальной команды, то она
выполнается в рамках текущего процесса. Так же выполняются и
определенные пользователем функции. Если имя команды не совпа-
дает ни с именем специальной команды, ни с именем функции, то
порождается новый процесс и осуществляется попытка выполнить
указанную команду.
Переменная PATH определяет путь поиска директории, содер-
жащей данную команду. По умолчанию это

::/bin:/usr/ bin:/util:/dss/rk

Директории поиска разделяются двоеточиями; :: означает текущую
директорию. Если имя команды содержит символ /, значение $PATH
не используется: имена, начинающиеся с / ищутся от корня, ос-
тальные - от текущей директории. Положение найденной команды
запоминается shellом и может быть опрошено командой hash.

    4_3. Окружение



Окружение - это набор пар имя-значение, которые передаются
выполняемой программе. Shell взаимодействует с окружением нес-
колькими способами. При запуске shell создает переменную для
каждой указанной пары, придавая ей соответствующее значение.
Если вы измените значание какой-либо из этих переменных или
создадите новую переменную, то это не окажет никакого влияния
на окружение, если не будет использована команда export для
связи переменной shellа с окружением (см. также set -a). Пере-
менная может быть удалена из окружения командой unset (см.).
Таким образом, окружение каждой из выполняемых shellом команд
формируется из всех неизмененных пар имя-значение, первоначаль-
но полученных shellом, минус пары, удаленные командой unset,
плюс все модифицированные и измененные пары, которые для этого
должны быть указаны в команде export.
Окружение простых команд может быть сформировано указанием
перед ней одного или нескольких присваиваний переменным. Так,

TERM=d460 <команда>

и

(export TERM; TERM=d460; <команда>)

эквивалентны. Переменные, участвующие в таких присваиваниях,
назовем ключевыми параметрами.
Если установлен флаг -k (см. set), то все ключевые пара-
метры помещаются в окружение команды, даже если они записаны
после команды.

    4_4. Сигналы



UNIXом поддерживаются следующие сигналы:

SIGHUP - 1 - отменить (hangup)
SIGINT - 2 - прерывание (interrupt)
SIGQUIT - 3 - нестандартный выход (quit)
SIGILL - 4 - неверная команда (illegal instruction)
SIGTRAP - 5 - ловушка (trace trap)
SIGFPE - 8 - исключительная ситуация при выполнении операций
с плавающей запятой (floating-point exception)
SIGKILL - 9 - уничтожение процесса (kill)
SIGBUS - 10 - ошибка шины (bus error)
SIGSEGV - 11 - нарушение сегментации (segmentation violation)
SIGSYS - 12 - неверный системный вызов (bad argument to sys-
tem call)
SIGPIPE - 13 - запись в канал без чтения из него (write on a
pipe with no one to read it)
SIGALRM - 14 - будильник (alarm clock)
SIGTERM - 15 - программное завершение процесса (software ter-
mination signal)

Сигналы SIGINT и SIGQUIT игнорируются, если команда была
запущена асинхронно. Иначе сигналы обрабатываются так же, как в
процессе-предке, за исключением сигнала SIGSEGV (см. также Спе-
циальные команды. Trap).

    4_5. Замечания



При выполненнии команд запоминается их местонахождение.
Поэтому при создании команды с тем же именем, но находящейся в
другой директории, все равно будет выполняться старая команда
(если вызов происходит по короткому имени). Для исправления си-
туации воспользуйтесь командой hash с ключом -r (см. Специаль-
ные команды).
Если вы переименовали текущую или вышележащую директорию,
то команда pwd может давать неверную информацию. Для исправле-
ния ситуации воспользуйтесь командой cd с полным именем дирек-
тории.

    * 5_ Дополнительные сведения *



    5_1. Команда test



Команда test применяется для проверки условия. Формат вы-
зова:
test <выражение>

или

[ <выражение> ]

Команда test вычисляет <выражение> и, если его значение - исти-
на, возвращает код завершения 0 (true); иначе - ненулевое зна-
чение (false). Ненулевой код завершения возвращается и если
опущены аргументы. <Выражение> может состоять из следующих при-
митивов:

-r файл - истина, если файл существует и доступен для
чтения
-w файл - истина, если файл существует и доступен для
записи
-x файл - истина, если файл существует и является вы-
полняемым
-f файл - истина, если файл существует и является обыч-
ным файлом
-d файл - истина, если файл существует и является ди-
ректорией
-c файл - истина, если файл существует и является спе-
циальным символьно-ориентированным файлом
-b файл - истина, если файл существует и является спе-
циальным блок-ориентированным файлом
-p файл - истина, если файл существует и является име-
нованным каналом (pipe)
-s файл - истина, если файл существует и имеет ненуле-
вую длину
-t [ дескриптор файла ]
- истина, если открытый файл с указанным деск-
риптором (по умолчанию 1) существует и ассоции-
рован с терминалом
-zho s1 - истина, если длина строки s1 нулевая
-n s1 - истина, если длина строки s1 ненулевая
s1 = s2 - истина, если строки s1 и s2 совпадают
s1 != s2 - истина, если строки s1 и s2 не совпадают
s1 - истина, если s1 непустая строка
n1 -eq n2 - истина, если целые n1 и n2 алгебраически сов-
падают . На месте -eq могут быть также -ne,
-gt, -ge, -lt, -le

    5_2. Команда expr



Команда expr применяется для вычисления выражений. Резуль-
тат выводится на стандартный вывод. Операнды выражения должны
быть разделены пробелами. Метасимволы должны быть экранированы.
Надо заметить, что 0 возвращается в качестве числа, а не для
индикации пустой строки. Строки, содержащие пробелы или другие
специальные символы, должны быть заключены в кавычки. Целые
рассматриваются как 32-битные числа.
Ниже приведен список операторов в порядке возврастания
приоритета, операции с равным приоритетом заключены в фигурные
скобки. Перед символами, которые должны быть экранированы, сто-
ит \.

<выр> \| <выр>
если первое <выр> не пустое и не нулевое, то
возвращает его, иначе возвращает второе <выр>
<выр> \& <выр>
если оба <выр> не пустые и не нулевые, то
возвращает первое <выр>, иначе возвращает 0
<выр> { =, \>, \>=, \<, \<=, != } <выр>
возвращает результат целочисленного сравнения
если оба <выр> - целые; иначе возвращает ре-
зультат лексического сравнения
<выр> { +, - } <выр>
сложение и вычитание целочисленных аргументов
<выр> { \*, /, % } <выр>
умножение, деление и получение остатка от деле-
ния целочисленных аргументов
<выр> : <выр>
оператор сопоставления : сопоставляет первый
аргумент со вторым, который должен быть регу-
лярным выражением. Обычно оператор сравнения
возвращает число символов, удовлетворяющих об-
разцу (0 при неудачном сравнении). Однако сим-
волы \( и \) могут применяться для выделения
части первого аргумента.

Регулярное выражение строится следующим образом:
. - обозначает любой символ
* - обозначает предыдущий символ, повторенный несколько
раз
[] - обозначают любой один из указанных между ними симво-
лов; группа символов может обозначаться с помощью
знака "-" (т.е. [0-9] эквивалентно [0123456789]); ес-
ли после [ стоит ^, то это эквивалентно любому симво-
лу, кроме указанных в скобках и <возврата_каретки>;
для указания ] в качестве образца, надо поставить ее
сразу за [ (т.е. []...]); . и * внутри квадратных
скобок обозначают самих себя
Все остальные символы (и ^, если стоит не в квадратных скобках)
обозначают самих себя. Для указания символов ., *,[ и ] надо
экранировать их (т.е. писать \., \*, \[, \]).

Примеры.
1. a=`expr $a + 1`
- увеличение на 1 переменной a
2. expr $a : '.*/\(.*\)' \| $a
- выделяет из имени файла короткое имя (т.е. из
/usr/util/ena выделяется ena). Внимание,
одиночный символ / будет воспринят как знак
операции деления.
3. expr $VAR : '.*'
- получение количества символов переменной VAR.

В качестве побочного эффекта expr возвращает следующие коды за-
вершения:
0 - если выражение не нуль и не пустая строка
1 - если выражение нуль или пустая строка
2 - для некорректных выражений
Команда expr также выдает следующие сообщения об ошибках:
syntax error - для ошибок в операторах или операндах
non-numeric argument - для попыток применения арифметических
операций к нечисловым строкам

Замечание.
Допустим, что мы хотим сравнить значение переменной a с
каким-либо символом, имеющим для expr особый смысл, например,
со знаком равенства. Пусть $a на самом деле является знаком ра-
венства. Так как аргументы предварительно обрабатываются shel-
lом, то команда

expr $a = '='

будет воспринята как

expr = = =

что синтаксически некорректно. В подобных случаях надо пользо-
ваться таким приемом:

expr X$a = X=

т.е. добавлением некоторого символа к обеим строкам, что никак
не влияет на результат сравнения, однако позволяет избежать
синтаксической ошибки.

    5_3. Команда ena



Команда ena позволяет получить части полного имени файла.
Первый аргумент - флаг, второй - имя файла. Команда различает
следующие флаги:
-n - имя файла без расширения
-f - имя файла с расширением
-e - расширение
-d - имя директории
-p - если имя файла начинается с . или .. , то эти
символы выделяются из имени

Ниже приводится текст программы ena, хранящийся в /util/ena.

# Get part of pathname

case $1 in
-n )
expr $2 : '.*/\(.*\)[.].*' \| $2 : '\(.*\)[.].*' \| $2
;;
-f )
expr $2 : '.*/\(.*\)' \| $2
;;
-e )
expr $2 : '.*\([.][^./]*\)' \| ' '
;;
-d )
expr $2 : '\(.*\)/.*' \| $2
;;
-p )
expr $2 : '\([.]\)/.*' \| $2 : '\([.][.]\)/.*' \| ' '
;;
* )
echo "error: unknown part of pathname $1"
exit 2
;;
esac


Источника -http://lib.ru/unixhelp/unixshell.txt

Монтируем ISO в Linux

[announce]Из-за слабой памяти сделал себе заметку о том как примонтировать iso в linux, чтобы лишний раз не тревожить гугл, может кому еще пригодиться[/announce]
Для того, чтобы примонтировать iso в Linux нужно для начало создать место куда будем монтировать

mkdir /mnt/iso

И дать команду

mount fileiso.iso /mnt/iso/ -t iso9660 -o ro,loop=/dev/loop0

fileiso.iso — образ

Своровано с blogpost.am9.ru

Куда пропал mkfs.vfat в ARCHLinux ??

[announce]Недавно понадобилось отформатировать раздел в fat под арчи, на команду mkfs.vfat получил многозначительный ответ — command not found: mkfs.vfat[/announce]
  Собственно суть в том, что под archlinux не оказалось команды для форматирования разделов в fatmkfs.vfat
Гугл подсказал мне страницу на которой я нашел решение. Выкладываю его сюда, что бы те у кого возникнет та же проблема, смогли найти ее решение на моем сайте. Все дело в двух пакетах, которые по-умолчанию не установлены в системе: dosfstools, ntfsprogs.

Устанавливаем —

pacman -S dosfstools
pacman -S ntfsprogs

Первый пакет даст нам команду mkfs.vfat, mkfs.msdos Второй пакет даст нам команду mkfs.ntfs

Источник

На сайте заработал раздел ‘Кодинг-медитация’

[announce]По мере возможностей буду выкладывать в раздел то что у меня накодилось за время функционирования. Начну с класса на php, который был написан одним из первых. Думаю в ближайшем будущем выложить самописный класс с пэджлистером и частично сворованные класы [/announce]
По мере возможностей буду выкладывать в раздел то что у меня накодилось за время функционирования. Начну с класса на php, который был написан одним из первых. Думаю в ближайшем будущем выложить самописный класс с пэджлистером и частично сворованные класы шаблонизатора и работы с мускулом.
Ссылка на раздел http://killercoder.ru/coding/

Сказка о драконе и воине

Жил был на свете Воин, Воин не знал о своем прошлом, но помнил он как появился на поляне с чудесными травами и прекрасными цветами и пошел Воин скитаться по Миру, Мир был чудесен, его окружали волшебные животные, по ночам с ним говорили звезды, а утром его встречало Солнце, которое проводило с ним весь день. Долго скитался воин, пока не набрел на дом в котором жила девушка неведанной красоты и если и было, что могло сравнится с ее красотой, то только красота ее сердца. Понял Воин, что не хочет он больше скитаться по миру, а хочет остаться с этой девушкой и быть с ней до самой смерти, чтобы она была рядом каждую минуту, когда он знает, что есть. И начал Воин жить с девушкой, и прекрасно они жили, утром вмести встречали Солнышко, а по ночам вмести разговаривали со звездами, и все было бы хорошо если бы не жил по соседству тиран страшный и не было бы у этого тирана армии жестокой, которая грабила и подчиняла себе людей. Как-то весеннем утром, когда солнышко только начало согревать землю своим теплом, пришли в дом к девушке всадники тирана, все в черных доспехах c эмблемой дракона на шлемах, солдаты привыкли, что все им дозволенно и не кто им не может ничего запретить и решили всадники воспользоваться небесной красотой девушки пока Воин был на охоте, но девушка не разрешила к себе прикоснутся за что ее убили, а дом подожгли, Воин был в лесу, когда увидел дым и что-то нехорошее почувствовал в своем сердце, а сердце воина всегда говорит правду и когда Воин пришел к дому, то увидел он то что осталось от дома после пожара и мертвую девушку рядом с клеймом дракона на теле. Не было предела горю Воина, он молчал держа на руках тело своей возлюбленной, а внутри сердце выло протяжным стоном, и если бы услышал кто этот вой, то понял бы что никогда не слышали песню печальней чем эта. Два дня и две ночи Воин лежал рядом с могилой девушке, а на третью ночь сердце воина покрылось мраком, в один миг Воин перестал ощущать жалость и сострадание к людям и был это самый страшный день в этом Мире, так солнечное небо заволокло тучами в тот миг, по следам Воин нашел путь к замку, нашел все что нужно, продумал, как свергнет и убьет тирана, а вмести с ним и всех его подданных и так и сделал, долго времени понадобилось Воину на осуществление своего плана, но так и было как он задумал, вот только с каждой новой смертью с каждой новой каплей крови, сердце Воина становилось темнее и настал момент, что перестали с ним говорить звезды и здороваться Солнышко по утрам, так как все небо заволокло темными черными тучами и сам Воин перестал существовать, а вместо него появился страшный дракон, сильный могущественный и безжалостный, у дракона этого появился свой замок на том месте где раньше был замок тирана, и армия со всадниками, которые были еще сильнее и еще могущественнее чем всадники тирана. И занимались всадники грабежами и подчиняли себе людей, так как всадникам дракона было дозволенно делать все. Как-то раз когда дракон восседал на своем троне в полном одиночестве в главном зале замка, к нему привели странника-философа, если и был в чем виновен философ, то только в том что много в нем было знаний, которые он получил в своих странствиях. Дракон хотел было сразу отдать приказ, чтобы философа казнили (так было принято поступать со всеми кто занимался философией в царстве Дракона), но так как дракону было скучно, он решил позабавить себя разговором со странником, и отпустив стражу остался с философом один на один, философ заговорил первый: «Знаю кем был ты когда-то и знаю кто ты есть сейчас и почему стал таким». Дракон удивился такой дерзости и сказал: «Не можешь ты знать кто я, старик, и не можешь знать моего пути, потому что кто и знал об этом того уже нет на этом свете, а кто пытался узнать, того я лично своими руками лишил жизни, ты видно с ума сошел от своих странствий раз смеешь у меня в замки так дерзить мне», а старик выслушал дракона и без страха продолжил: «Я знаю, что когда-то не было дракона, а был Воин с сердцем как чистый родник и умело это сердце разговорить со звездами и здоровалось с ним Солнышко каждое утро и любило это сердце девушку небесной красоты, но сломило сердце жестокость человеческая и умер воин, а вместо него появился дракон, который своей жестокостью и беспощадностью наводит страх на людей». Дракон, услышав такое, пришел в ярость. Да как ты смеешь говорить мне такое, я лично убью сейчас тебя и c этими словами вынув из ножен меч, дракон кинулся на философа, а старик поднял свою руку навстречу и все перед драконом застыло в один миг, только слова философа прозвучали в его ушах: «Я дам тебе еще один шанс, и исход битвы будет зависеть только от тебя», с этими словами дракон забыл все что помнил и в этот же миг Воин открыл глаза на поляне с чудесными травами и прекрасными цветами…

 

ГАВк

[announce]Инструменты прикладного программиста: строковый процессор awk. Описано популярное инструментальное средство среды программиста в UNIX: строковый процессор awk, позволяющий эффективно обрабатывать различную текстовую информацию. Предназначена для прикладных программистов, специалистов по информатике и студентов, специализирующихся в информационных технологиях. [/announce]

Cтроковый процессор awk

Е.А. Нурминский
Благовещенск1998

Содержание:

Что такое строковый процессор awk

Значительную долю работы, которую обычно выполняет программист или прикладной специалист, заключается на самом деле в преобразовании текстовых файлов: выделении из них определенных частей, преобразовании одних строк в другие, дописывании какой-либо информации, простейшие вычисления с данными, извлекаемыми из этих файлов и т.д., и т.п.

Подобные задания с одной стороны могут быть слишком трудоемки для обычного текстового редактора, так как могут требовать просмотра тысяч строк текста, а с другой стороны — неунифицируемыми, так как информация не структурирована в том виде, как это имеет место в базах данных или электронных таблицах. Для эффективной работы в этой »серой» области давно предложен и с успехом применяется строковый процессор awk.

Это процессор рассматривает входной поток данных как состоящий из записей, разделенными специальными символами (RS). По умолчанию таким символом является символ перехода на новую строку (‘\n‘). Запись считается разделенной ( символами FS)1 на поля и строковый процессор awk автоматически выделяет эти поля и дает возможность производить с ними различные операции. По сути дела, это единственное предположение, которое делает awk относительно структуры входных данных.

Задание процесса обработки некоторого файла с помощью программы awk состоит в описании действий, которые нужно произвести с записями и полями. Для этого awk предоставляет в распоряжение программиста развитый язык программирования, напоминающий популярный язык программированияC. Это и не удивительно, так как авторы awk (Альфред В. Ахо ( Alfred V. Aho — a), Питер Дж. Вайнбергер ( Peter J. Weinberger — w ) и Брайан У. Кернихан ( Brian W. Kernighan — k) известны как родоначальники языка C и операционной системы UNIX.

Входной язык процессора awk является в определенном смысле »упрощенным» C и не содержит таких типов данных как указатели и структуры. Отсутствуют в нем и другие элементы языка C, такие, напримерa, как команды препроцессора, битовые операции, локализация переменных и пр.

Однако, в отличие от Cawk предоставляет удобный операционный синтаксис для строковых операций, автоматическое преобразование строка-число, автоматический лексический разбор входного потока и т.п., что делает его исключительно удобным средством выполнения простых, но трудоемких операций c текстовыми файлами больших размеров. Кроме этого,awk является интерпретирующим языком, что существенно упрощает процесс разработки awk-приложений.

Все это делает awk весьма эффективным и полезным инструментом, умело владеть которым должен каждый грамотный программист.

Структура awk-файла

Программа на языке awk состоит из пар:образец     действие.Каждая запись проверяется встроенным механизмом awk на соответствие заданному образцу и если текущая запись соответствует этому образцу, выполняется действие.

Программа на awk может содержать определения функций, которые можно считать также имеющими форму образец — действие со специальным видом образца. Подробнее задание функций описано в разделе [*]

Действие описывается операторами языка awk, которые подробнее рассматриваются далее. Чтобы отделить условие от действия, последнее обычно заключается в фигурные скобки . Ислючение составляет лишь случай пустого действия, которое в этом случае приводит к выводу на печать входной записи.

Образцы и регулярные выражения

Для задания образцов используются следующие средства:

 

/регулярное выражение/
логическое выражение
проверка на совпадение
диапазон записей
заголовок функции
BEGIN
END

 

 

Понятие регулярного выражения совпадает в основном с регулярными выражениями, признаваемыми grep[1], что неудивительно, так как авторы awk сильно повлияли и на разработку grep.

Простейшим случаем регулярного выражения является строка символов. Программа ( с пустым действием )

    /Иванов/

напечатает из текстового файла те строки, которые содержат подстроку"Иванов" ( в том числе и "Ивановский машиностроительный завод" ).

Образцы-регулярные выражения позволяют более точно описать класс строк, которые необходимо обработать или напечатать.

Помимо обычных символов регулярное выражение может содержать специальные метасимволы, которые дают возможность описывать различные подмножества строк.

Канонический список метасимволов содержит следующие элементы:

 

^ $ [ ] - + * .(точка) \

 

Метасимволы имеют следующую сематику:

^ — соответствует началу строки. Это позволяет выделять строки не только по наличию в них тех или иных символов, но и по их расположению в строке. Так, например, /^A/ соответствует строкам (записям), начинающимся на A.
$ — соответствует концу строки. Например,/A$/ отвечает строкам, заканчивающимся на A.
[ ] — c помощью этих символов описывают множества единичных символов. В простейшем случае эти множества описываются перечислением: [AWK]соответствует множеству из трех букв A, W, K. Соответственно G[AWK] представляет множество строк{ GA, GW, GK }.
- — используется для задания диапазона символов, например,[a-z] соответствует символам от a до z, как они расположены в таблице кодов ASCII.
+ — этот символ обозначает многократное ( не менее одного ) повторение в образце символа, предшествующего +.
* — также многократное, но возможно также и нулевое повторение предыдущего символа. Типичный пример: [1-9][0-9]* — положительные целые числа.
.(точка) — обозначает произвольный единичный символ. Легендарную известность приобрела комбинация .*, которая обозначает таким образом произвольную комбинацию символов.
\ — отменяет специальное значение последующего символа. Отмена специального значения \ производится при помощи \\.

Логические выражения строятся с помощью операций, приведенных в табл. [*].

 

Table:Логические операции языка awk.
|| логическое или
&& логическое и
<, <= меньше, меньше или равно
>=, > больше, больше или равно
== совпадение (строк) или численное равенство
!= несовпадение или неравенство
~ проверка на содержание
! отрицание

Например, образец /^A/ && ! /^AB/соответствует записям, начинающимся на символ A, но не имеющим в качестве последующего символа B.

В качестве образца можно указать также и группу строк. Такая группа строк обозначается в поле образца как

    образец-1, образец-2

и означает, что соответствующее действие будет выполнятся для строк, которым предшествовала строка, соответствующаяобразец-1, но предшествующим строке, соответствующейобразец-2.

Специальные символы BEGIN, END обозначают начало и конец файла ввода. С их помощью можно выполнить до начала действительной работы awk желаемые действия по настройке awk, а по завершению работы — выдать какую-либо итоговую информацию.

Действия awk

Действия awk представляюют собой последовательность операций, записаных на языке awk и заключенных в фигурные скобки. Простейшим вариантом действия является комбинация {}, которая по соглашению awk вызывает печать текущей строки (записи). Вокруг пустого действия скобки необязательны, если в пареобразец—действие присутствует нетривиальный образец. Если образец пуст, то присутствие фигурных скобок обязательно.

Тело действия в awk представляет собой программу на языке awk, в котором присутствуют многие из аттрибутов языка программирования: присвоения, выражения, условные операторы, циклы, операторы ввода-вывода, команды работы с файловой системой и пр. Команды awk могут группироваться с помощью тех же самых фигурных скобок {} и образовывать составные операторы.

К восторгу поклонников структурного программирования в awk отсутствует оператор GOTO и метки.

Подробнее команды awk рассмотрены в следующем разделе.

Команды awk

После того, как awk прочел очередную запись и разделил ее на поля, содержимое этих полей становиться доступным как значения специальных переменных 2, .... При этом$1 соответствует первому полю,$2 — второму и т.д. Далее с этими переменными могут быть произведены различные операции, используя набор команд awk. Программа awk предоставляет пользователю широкий набор команд, обеспечивающий выполнение достаточно полного репертуара операций с вводимыми данными.

Ввод данных в awk

По умолчанию awk читает с устройства стандартного ввода (клавиатура), однако может читать и подготовленный заранее файл данных или конвейерный вывод другой программы.

В строке вызова awk можно указать несколько файлов данных,awk будет последовательно их обрабатывать. Имя текущего файла ввода доступно как значение переменной FILENAME.

Эти базовые возможности awk по вводу данных могут быть существенно расширены использованием функции (или команды) getline.

Использованная без аргументов, getline просто читает очередную запись из текущего файла ввода. Это позволяет, например, специальным образом обработать следующую строку, если вы, например, обнаружили во входных данных сообщение типа:

TOP SECRET!  NEXT LINE TO BE BURNED BEFORE READING!

После выполнения команды getlineawk продолжает нормальный цикл своей деятельности, применяя к этой записи последующие пары образец — действие.

Команда getline может быть использована для ввода значения строковой переменной:

    getline message

Никаких побочных эффектов при этом не происходит, за исключением того, что изменяется счетчик записей NR.

Команда getline может читать из поименованного файла, используя технику перенаправления:

    getline < file

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

Если getline не встретила каких-либо проблем при исполнении, она возвращает значение 1. Если при исполнении обнаружен конец файла, то возвращается 0, если обнаружена ошибка, то возвращается -1. В последнем случае причину ошибки можно найти, проанализировав значение переменной ERRNO.

Печать (вывод) данных

Одна из наиболее употребительных операций с вводимыми данными — это их печать, возможно селективная и сопровождаемая некоторыми простейшими преобразованиями. Для печати awk использует операторыprint, printf, sprints. Простейший из них — print имеет синтаксис

    print a,b,c, ... z

где a, b, c, ..., z это список вывода, который может включать различные строковые и арифметические выражения.

Например, в результате исполнения оператора

    print exp(1)

будет напечатано число

2.71828

а в результате выполнения оператора

    print "Вася" "+" "Маша"

будет напечатана строка

Вася+Маша

Обратите внимание, что напечаталась конкатенированная строка, т.е."Вася" "+" "Маша"представляет собой строковое выражение, значением которого является строка"Вася+Маша".

Если печать будет производиться оператором

    print "Вася","+","Маша"

результат будет обычно выглядеть как

Вася + Маша

Значения списка вывода разделены в этом случае пробелом, которые является значением по умолчанию специальной внутренней переменнойOFS. Эта и другие специальные переменные awk будут рассмотрены позднее, а пока заметим, что значение OFS может быть изменено пользователем. Например, если определить OFS="\n", то тот же оператор печати выдаст результат

Вася+Маша

Оператор

    print $1

выведет на печать содержимое первого, а оператор

    print $NF

последнего поля текущей записи.

По умолчанию для вывода чисел awk использует в качестве формата значение специальной внутренней переменной OFMT, оычно имеющей значение "%.6g". Изменив это значение, можно изменить форму вывода чисел, например,OFMT="%.0f"будет выводить все числа как целые, округляя их до ближайшего.

Операторы printf, sprintf осуществляют форматированый вывод в духе операторов вывода языка C. Для этих операторов первым элементом списка вывода является строка, содержащая описание форматов вывода последующих элементов списка. Для описания форматов применимы стандартные правила языка C:

%s строка символов
%d десятичное целое
%f вещественное число с десятичной точкой
%o восьмеричное число
%x шестнадцатиричное число

и обычные правила указаний ширины выводимого поля, количества десятичных знаков, выравнивания и пр.

Предопределенные разделители OFS, ORS не влияют на вывод, осуществляемый посредством printf, в частности в конце записи не добавляется автоматически символ перехода на новую строку ( значение ORS по умолчанию ).

Специфика оператора sprintf заключается в том, что вывод происходит не во внешний файл, а возвращается в качестве значения функцииsprintf. Соответственно синтаксис sprintf воспроизводит вызов функции в awk:

    pi = sprintf("%f10.6", 4*atan(1))

присваивает строковой переменной pi значение " 3.141592".

Вывод операторов print, printf может быть перенаправлен стандартным для UNIX образом. Целью такого перенааправления может служить какой-либо поименованный файл или другая команда операционной системы. В случае файла результат команды print или printfможет либо затирать предыдущее содержание файла, либо дописываться к нему. Первое осуществляется командой

    print "Вася+Маша" > "message.of.the.day"

а второе — командой

    print "Вася+Маша" » "message.of.the.day"

Следует иметь в виду, что различие между этими вариантами перенаправления существует лишь до открытия файла message.of.the.day и первой операции записи в этот файл. Последующие перенаправления будут давать тот же результат: новые порции выводимой информации будут дописываться к содержанию файла. Если это нежелательно, необходимо в явном виде закрывать файл с помощью оператора close, рассмотренного ниже.

Программа awk допускает также и перенаправление вывода в конвейер. В этом случае опреатор вывода имеет вид

    printf A, B, C, ... | CMD

где команда CMD может быть произвольным строковым выражением. Значение этого строкового выражения передается комадному интерпретатору операционной системы для исполнения.

При перенаправлении вывода следует иметь в виду, что некоторые реализации awk накладывают серьезные ограниения на количество одновременно открытых файлов. Поэтому хорошим тоном программирования на awk является немедленное закрытие файлов ввода/вывода, как только в них отпадает необходимость.

Если файлы и конвейеры открываются awk по мере необходимости и остаются открытыми до окончания работы программы, то закрытие файлов осуществляется командами

close (filename) закрыть файл filename
close (COMMAND) закрыть конвейер COMMAND.

Как это принято в UNIX, awk направляет вывод по каналу стандартного вывода stdout. Для вывода по каналу ошибок stderr нужно что-то вроде

    print "ERROR" | " cat 1 > & 2"

В разных версиях awk используются разные трюки для работы с каналами. В частности, в GAWK используются специальные имена, приведенные в табл. [*].

 

Table:Описатели стандартных каналов ввода-вывода
Имя канала fd
/dev/stdin 0
/dev/stdout 1
/dev/stderr 2

Для работы с файлом, имеющим описатель N, используется также символическое имя /dev/fd/N

.

 

Условное выполнение

Условное выполнение осуществляется с помощью оператораif-then-else имеющего в общем случае следующую форму:

 
if (условие) then { действие-1 }
else { действие-2 }

Если действие-1 или -2 содержит один единственный оператор, фигурные скобки не требуются.

К некоторой трудно объяснимой особенности awk относится то, что если действие-1 содержит один операнд, то за ним должна следовать точка с запятой (;).

Циклы

awk содержит хорошо известный C-программистам набор операторов цикла: do-while, while, for

.

Цикл do-while имеет вид

do {    тело цикла} while (условие)

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

Цикл while имеет вид

while (условие) {      тело цикла}

и проверка условия осуществляется до исполнения тела цикла.

Цикл for имеет две формы в awk: одна — традиционная:

for(инициализация; условия; завершение){    тело цикла}

и вторая — ассоциативная:

for(index in list){    тело цикла}

где list — ассоциативный массив, подробности работы с которыми будут рассмотрены ниже. На содержательном уровне вторая форма оператора for означает использование тела цикла для каждого элемента ассоциативного массива list. Порядок исполнения непредсказуем.

В приведенных конструкциях фигурные скобки {} необязательны если тело цикла представляет собой один оператор.

В отличие от Cязык awk содержит две формы операторов досрочного прерывания цикла и досрочного перехода к следующему выполнению тела цикла. Это связано с тем, что сама конструкция awk подразумевает неявный внешний цикл: чтение данных — обработка.

Для досрочного прекращения этого процесса обработки служит операторexit. Он по сути дела эквивалентен прерыванию текущих операций обработки и чтению признака конца входного файла (EOF для C-патриотов). Если в awk-программе есть действия, ассоциированные с образом END, они будут выполнены.

Для досрочного прерывания процесса обработки текущей записи (и запуска новой операции чтения — обработки) служит оператор next. Для управления циклами, в явном виде содержащимися вawk-программах, служат операторы break, continue. Оператор breakпрекращает выполнение цикла, continue запускает новое исполнение тела цикла.

К операторам управления последовательностью операций с некоторой натяжкой можно отнести и return — оператор возврата из функции, описанной программистом. Оператор

    return выражение

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

Массивы

Отличительной чертой awk является своеобразное понятие массива. В традиционных языках программирования типа C илиFortran массив A представляет собой с математической точки зрения функцию целочисленной переменной-индекса. В awk переменная-индекс может быть м строкой или строковым выражением, т.е. массив представляет собой функцию, определенную на существенно большем множестве и, следовательно, предоставляет программисту значительно большие выразительные возможности.

Например, если перед вами стоит задача разобрать текстовый файл-таблицу, в которой, скажем, в первом столбце находится фамилия работника, получившего вознаграждение, обьем которого находится в седьмом столбце таблицы и трубуется определить суммарное вознаграждение для каждого из работающих, awk решает эту задачу с потрясающей легкостью:

    { payoff[7 }

и проблема остается лишь в выводе значений массива payoffпо завершению работы программы.

Конечно, для такого понятия массива трудно ввести предварительное декларирование и элементы массивов в awk создаются в момент использования. По исчерпыванию необходимости в этом элементе, от него можно в явном виде избавиться при помощи оператораdelete:

    delete payoff["Иванов"]

и освободить память для более важных дел. Удалить весь массив payoff можно командой

    delete payoff

Определение множества индексов данного массива и обход элементов массива можно произвести с помощью ассоциативного цикла, уже упомянутого выше. Отрывок awk-программы

END	{	for(name in payoff)		printf name, payoff[name]	}

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

Единственным недостатком такого простого решения являетя неопределенный порядок индексов массива payoff, в связи с чем их имена почти наверняка не будут выведены в алфавитном порядке !

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

Еще одним часто встречающимся способом порождения массивов является использование встроенной функции split. Эта функция может иметь два или три аргумента и используется для разбиение какой-либо строки на отдельные части, заполняющие собой массив.

Например, оператор

    n = split("31.12.1999", date, ".")

разобьет строку "31.12.1999" на три части"31", "12", "1999", используя в качестве разделителя символ "."и присвоит массиву date значения:

date[1] = "31", date[2] = "12", date[3] = "1999".

Переменной n присвоится, конечно, значение 3.

Если функция split вызывается с двумя аргуменами, подразумевается, что символом-разделителем является значение встроенной переменной awkFS — по умолчанию пробельный символ.

Таким образом

    nn = split($0, tokens)

в явном виде выполнит ту работу, что awk делает по умолчанию: разделит входную строку ($0) на отдельные элементы и запишет их в массив tokens. Количество элементов будет запомнено, как значение переменной nn.

Это полностью эквивалентно явному циклу

	for(i = 1; i <= NF; i++)		tokens[i] = $i	nn = NF

но, конечно, намного более эффективно, экономит память и бумагу и, следовательно, сохраняет окружающую среду.

Функции

Хотя awk и нельзя назвать сильно модульным языком, он тем не менее содержит достаточно развитую библиотеку встроенных функций и дает возможность пользователю определить свои собственные функции.

Встроенные функции

Язык awk предоставляет достаточно большой выбор встроенных числовых и строковых функций, привычных для C-программиста.

Их основные характеристики приведены в табл. [*].

Таблица [*]. Встроенные функции языка awk
   
Численные функции
   
atan2 арктангенс
cos косинус
exp экспонента
int целочисленное округление
log натуральный логарифм
rand псевдослучайное число из интервала
sin синус
sqrt квадратный корень
srand инциализация случайного датчика
Строковые функции
   
sub, gsub выделение подстроки
index поиск мета в строке
length длина строки
match проверка на наличие подстроки
split разбивка строки на элементы
substr выделение подстроки
tolower перевод в нижний регистр
toupper перевод в верхний регистр
Функции, определяющие системное время
systime() возвращает число секунд, прошедших со времени некоторого знаменательного с точки зрения оперционной системы события. На POSIX-стандартных системах это время, прошедшее с полночи 1 января 1979 г. по Гринвичу.
strftime() возвращает строковое значение временной меткиTIME (второй аргумент) в соответствии с форматом FORMAT(первый аргумент). Детали слишком утомительны, чтобы их излагать в таком малом обьеме.
Разное
   
system(s) строка s интерпретируется как команда операционной системы и исполняется командным интерпретатором.

Численные функции имеют вполне традиционный смысл, за исключением, пожалуй, atan2(x,y) , которая вычисляет для и равна для . Значение atan2(0, 0) = 0.

Генератор случайных чисел rand() может быть проинициализирован с помощью функции srand(x). По умолчанию в качестве x используется время дня. Если rand() не инициализаруется, то при повторном исполнении awk-программы генерируется та же самая последовательность чисел.

Строковые функции имеют следующий синтаксис и действие:

заменяют в строке u первое вхождение регулярного выражения tна строку s. Вызов с двумя аргументами означает, что эта операция применяется к текущей записи $0.
— аналогична sub, но заменяются все вхожденияt.
— целочисленная функция, возвращающая в качестве значения длину строки s.
возвращают в качестве значения подстроку строкиs, начинающуюся с -го символа и имеющую символов. Если n отстуствует, считается.
проверяет, содержит ли строка s регулярное выражение t. Если s содержит t, то match(s,t) указывает на начало первого вхождения t в s. Если s не содержит t, то match(s,t) = 0.
целочисленная функция, возвращающая в качестве значения длину строки s.
проверяет, содержит ли строка s строку t. Если s содержит t, то index(s,t) указывает на начало первого вхождения t в s. Если s не содержит t, то index(s,t) = 0.
переводят строку s в верхний (нижний) регистры.

Функции, определяемые программистом

В awk программист может определить свои собственные функции, используя синтаксис

function FunctionName(a, b, ..., z)	{	... тело функции ...	}

Относительно имени функции и имен переменных выполняются обычные соглашения о допустимых идентификаторах в awk.

Тело функции представляет собой набор awk-команд, применяемых к списку параметров заголовка функции. Функция может быть »реккурсивной», вызывая самое себя. Количество аргументов в фактическом вызове функции может отличаться от количества аргументов в описании. »Лишние» переменные получают в качестве значений пустую строку"". При вызове функции в awk-программе не должно быть никаких символов ( в том числе и пробельных ) между именем функции и списком аргументов в скобках.

В awk используется механизм передачи параметров »по значению», так что всякие изменения, происходящие с аргументами в функции, не изменяют значений этих переменных вне функции.

Однако, если аргументом функции является массив, значения его элементов могут быть изменены внутри тела функции.

Переменные

Переменные языка awk могут быть разделены на два класса: встроенные в язык и определяемые программистом. Первые из них имеют фиксированные имена и специальным образом влияют на работу awk. Вторые используются традиционным образом для хранения и использования каких-либо промежуточных результатов.

Встроенные переменные

В последующей таблице приведены встроенные переменные ряда диалектов awk

.

Каноническое множество
FILENAME имя файла, обрабатываемого awk в настоящий момент
FS разделитель полей в записи
NF количество полей в текущей записи
NR номер текущуй записи
OFS разделитель полей при выводе
ORS рпзделитель записей при выводе
RS разделитель записей
$0 адресует всю запись целиком
$n адресует -ое поле в записи
gawk
ARGV массив аргументов командной строки
ARGC количесвто аргументов командной строки
CONVFMT формат внутреннего преобразования »число» »строка»
ENVIRON массив переменных среды
FNR номер записи в текущем файле
IGNORECASE если эта переменная непуста, то все сравнения awk проводит игнорируя разницу ммежду буквами в верхнем и нижнем регистрах
OFMT формат вывода для чисел
RSTART положение первого совпадения, найденого командой match
RLENGTH длина совпадения, найденого командой match
SUBSEP символ-разделитель для индексов массивов

Ваш локальный вариант awk может иметь дополнительные переменные, или в нем могут отсутствовать какие либо из приведенных выше. С деталями лучше ознакомиться по соответствующему руководству.

Переменные, определяемые программистом

В awk можно традиционным образом использовать переменные, имена которых могут содержать буквы, цифры и символ подчеркивания. Имя переменной не должно начинаться на цифру, awk различает верхний и нижний регистры.

Переменные, используемые в программах awk, не требуют предварительного декларирования и их тип определяется контекстом использования. Переменная box может быть проинициализирована строкой "4":

	box = "4"

затем с ней можно выполнить арифметическое действие

	box = box*4

и затем строковую операцию ( например, конкатенацию )

	box = box " boxes of candies"

в результате чего переменная box примет значение "16 boxes of candies".

Преобразование из строкового в числовой тип и обратно происходит прозрачным для пользователя образом. Повлиять на это преобразование можно изменив значение встроенной переменнойCONVFMT, которая по умолчанию имеет значение "%.6g". Результат преобразования числа в строку эквивалентен использованию функции sprintf c переменной CONVFMT, определяющей формат преобразования.

При переводе строки в число awk проявляет досточно интеллекта для того, чтобы распознать "100", "1e2", "100fix" как число 100. При переводе в числовую форму строк типа "Вася" возвращается нулевое значение.

Если по каким-либо причинам необходимо форсировано перевести переменную или выражение из числовой формы в строковую, рекомендуется конкатенировать ее с пустой строкой "". Если необходим перевод из строковой в числовую форму, можно прибавить 0.

Значения переменных в awk определяется не только присвоением, операторами инкремента и декремента, но могут быть определены и в командной строке. Последнее особенно удобно при написании shell-программ, содержащих обращения к awk. Значения переменных опеределяются при этом используя опцию -v. описанную ниже.

 

Вызов awk

Вызов awk зависит, конечно, от операционной системы, однако принятым является некий UNIX-подобный стиль, при котором командная строка выглядит примерно следующим образом:

awk [опции] программа файл данных

где программа может быть либо непосредственно текстом awk-программы (в одинарных кавычках), либо ссылкой вида -f file на файл file, содержащий awk-программу. Первый вариант применяется обычно для коротких awk-программ, второй — для сложных awk-текстов, библиотек функций и пр. Используя опцию source, можно смешивать эти два способа представления awk-программ.

Файл данный представляет собой тот файл, к которому применяется awk-программа. Если такой файл отсутствует, по awk-программа применяется к потоку стандартного ввода. Это позволяет применять awk в конвейерах.

Опиции для awk задаются в POSIX-стиле буквой, перед которой располагается знак минус (-). Счастливые пользователи gawk могут использовать »длиные» имена для опций в GNU-стиле, перед которыми необходимо разместить два минуса (-). Вызывая gawk, можно вперемешку использовать длиные и короткие формы опций.

Программа awk понимает в основном следующие опции:

\( \begin{array}{l} \mbox{\tt -F FS}\\ \mbox{\tt --field-separator=FS} \end{array}\) Эта опция устанавливает разделитель полей в записи равный FS.
\( \begin{array}{l} \mbox{\tt -f file}\\ \mbox{\tt --file=file} \end{array}\) указывает на то, что awk-программа находится в файле file
\( \begin{array}{l} \mbox{\tt -v VAR=VAL}\\ \mbox{\tt --assign=VAR=VAL} \end{array}\) присваивает переменной VAR значение VAL. Присвоение выполняется перед началом работы awk-программы.
\( \begin{array}{l} \mbox{\tt -W source=file}\\ \mbox{\tt --source file} \end{array}\) Так же как и f-опция, указывает на то, что awk-программа ( или часть ее ) находится в файле file. Позволяет использовать комбинацию ввода программы через командную строку и из заранее подготовленного файла.
\( \begin{array}{l} \mbox{\tt -W version}\\ \mbox{\tt --version} \end{array}\) Сообщает версию awk(gawk).
-c заставляет »gawk» работать как »awk».
- обозначает конец опций. Далее »-» не обозначает начало опции. Эта опция дает возможность работать с файлами, имена которых начинаются на дефис(-).

Снова отметим, что ваш локальный вариант awk может иметь и другой набор опций, с которыми лучше ознакомиться по руководству. Здесь приведены лишь наиболее употребительные.

Простейшие полезные программки

  • 	{ max = NF > max ? NF : max }
    END 	{ print max }
    

    Это программа подсчитывает максимальное число полей в записях.

  • length($0) < 64
    
    

    Эта ультракороткая программа печатает все строки короче 64 символов. В частности она может помочь восстановить испорченый uuencode-ированый файл, потерявший в процессе передачи хвостовые пробелы в некоторых строках.

    Область действия здесь пуста и поэтому по умолчаниюю производится печать записи.

  • NF > 0
    

    Эта программа фактически удаляет все пустые строки из файла.

  • 	{ if (NF > 0) print }
    

    Эта программа эквивалента предыдущей, но решение о печати записи принимается в области действия, используя условный оператор.

  • BEGIN { for (i = 1; i <= 10; i++) print int(101 * rand()) }
    

    Эта программа печатает 10 целых случайных чисел из интервала от нуля до 100.

  • ls -l | awk '{ x += $4 } ; END { print "total bytes: " x }
    

    Эта программа подсчитывает количество байтов в файлах данной директории.

  • expand FILE | awk '{ x = x < length() ? length() : x }
       END { print "maximum line length is " x }''
    

    Определение максимальной длины записи в файле. Предварительная обработка программаой expand превращает символы табуляции в соответствующее число пробелов, чтобы видимая длина строки совпадала с количеством символов.

  • BEGIN { FS = ":" }
    { print $1 | "sort" }
    

    Эта программа выделяет из файла /etc/passwd с регистрационной информацией имена пользователей и печатает их в алфавитном порядке.

  • { nlines++ }
    END { print nlines }
    

    Подсчет строк в файле.

  • END { print NR }
    

    Также подсчет строк в файле,но уже средствами awk.

  • { print NR, $0 }
    

    Эта программа нумерут сроки в файле.

Где растет awk?

Наиболее близко awk связан с операционной системой UNIX и, как правило, входит во все ее поставки. Более того, он зачастую используется в инсталляционных программах, так что UNIX-программисты воспринимают его как неотемлимый элемент среды UNIX

.

Основным местом хранения awk является депозитарий GNU-программного обеспечения http://www.gnu.org, через который можно выйти на многочисленные зеркала. Версию для DOS/WINDOWS можно найти на сайте www.simtel.net и его зеркалах.

Упражнения

Эти упражнения позволят вам удостовериться в своем мастерстве awk-программирования.

  1. Написать фильтр для объединения каждой нечетной строки файла с последующей (четной)
  2. Написать программу, которая бы выводила символы строки-аргумента в обратном порядке.
  3. Написать программу, которая бы выводила бы на русском языке числа до сотен миллионов.
  4. Написать программу, которая бы решала линейные уравнения вида:

        27*x = 43

     

Bibliography

 

1
Керниган Б.В., Пайк Р. UNIX— универсальная среда программирования: Пер. с англ.; Предисл. М.И. Белякова.— М.: Финансы и статистика, 1992.— 304 с.

Источник: http://kpmit.wl.dvgu.ru/library/nurminski_gawk/gawk.html