Утилиты
Регулярные выражения в Perl
Что есть
* Символ * . * [...] [^...] * + * * ? + {,} * (). Эти скобки, в тех рег. выр, где используется ссылки, скобки нумеруются по порядку их появления в рег. выр.. При этом, если скобка повторяется, то попадает в регистр только первое совпадение, то есть для рег выр ((ab)+) в первую скобку попадёт ababab..., во вторую --- ab. Кроме того, можно использовать регистры прямо в рег. выр: ([ab])\1. * ^ | $
Про Perl
* Есть look ahead, look behind. Это наборы символов класса ^$|, которые сами не сопоставляются в строке, но всё выраж. считается нормальным, если то, что в look-ahead сопоставилось с тем, что стоит непосредственно за ним. То есть, в перле появляются штуки, осущ. проверки условий. Некоторые движки откажутся внутри look-behind втыкать что-угодно. Это нужно, особенно в случае negative, когда в строке чего-то нет. * В перле есть groupings * В перле есть вещи, которые позволяют управлть разбором
Про это вс лектор расск. не будет, но забыл упомянуть про одну группу модификаторов, которые исп. в Перле. Это модификаторы нежадные. По традиции, правило самый левый самый длинный, точнее, правидо обработки модификаторов, называется greedy. Почему: потому что если ставим звёждочку/плюсик, то это жадный повторитель. В качестве сопостю. подставляется сама длинная из возможных слева подсторок. Например, иногда хочется, чтобы было не от первой до последней, а до первой закрывающей скобки, например. В данном случае можно написать что-то в духе <[^>]*>, но в более сложных случаях это не работает. Для этого сущ. более сложный класс повторителей *? и +? --- выбирается не самая длинная, а самая короткая. Чем это опасно? Пототму что в отличие от классич. рег. выр., далеко не всегда можно интерпретировать, как пойдёт разбор выражения. Например, (ab|zzz0)+? Тем не менее, лектор безоговорочно признаёт право на существование и лукахеда, и модификаторов жадности.
PCRE
В какое-то время создатели ЧП решили пресечь практику, когда каждый автор создаёт свою реализацию регэкспов. С одной стороны, появился gnu regexp, с другой был перл.
Утилиты
Мы давно говорили, что шелл в первую очередь интегратор. Тут есть два замечания:
- Нет задачи рассмотреть всевозможные команды
- Любого человека, зан. командной строкой, всегда подстерегает выбор:
- Искать в документации нужную утилиту
- Написать собственную программу
Чем хорошо первый вариант: если вам встретилась задача, например, выковырять третью колонку из файла. Вы порылись документации, нашли программу cut. И тогда cut -d\ -f3 file. Задача решена. И, поскольку задача встала один раз, то она возникнет ещё и ещё, и придётся решать подобные задачи. И вам надо запоминать не 2000 команд, а 1. И запомнить потому, что вероятнее всего вам придётся ею пользоваться. Тогда вы запоминаете те программы, которые вам нужно пользоваться.
Второй вариант --- берёте любимй язык программирования, делаете на нём велосипед. И может иногда оказаться, что программа окажется короче и лучше, например, то же на авк: awk '{ print $3 }' file.
По определённым присчинам летор предпочитает первое. Но, понятно, что поиск не до посинения, чем более специфична и редка задача, тем больше смысла писать программу.
Команды
sed. То же на седе: sed -r '([\S]+[\s]+){2}([\s]+)/\2/'
Родового порядка замечания: такие сборники утилит, которые полезны, они собраны в пакеты, которые оканчиваются обычно на *utils или *tools. Есть coreutils, без каоторых тяжело. Помимо них, есть textutils, buildutils... Есть специфичные сборки.
Теперь немножко списковых структур:
- Разбор имени файла
- basename, dirname --- первый отделяет имя файла, второй --- имя каталога
- realpath --- реальное имя
- readlnk --- выдаёт содержимое симлинка
Мы сейчас возвр. к идеализированной картине, когда все объекты представлены в виде файлов, и для упр. системой дост. иметь утилиты, которые работают с двумя видами сущностей. Именно по этой причине, большая чать того, о чём мы разг., входит либо в coreutils, либо fileutils, textutils, findutils
- Работа с файлами
- cat, cut, head, tail --- вывод файла, разрезание, начало, конец
- Работа с текстами
- join, paste --- paste --- сливает два файла построчно
- Работа с файлами
- dd --- почему исп. со всем. По умолч. работает как cat, только надо руками сказать, откуда писать и куда: dd if=... of=... . Кроме того, можно сказать, начиная с какого блока копировать, сколько и как, можно указать размер блока.
- split, csplit --- split пилит файл на части равной длины. Можно распилить как на заданное кол. частей, так и заданного размера. csplit разбивает файл по спецсимволам.
- программы, которые файл слегка преобразуют
- sort --- сортирует файл по строкам в лекс. порядке.
- Для сортировки по цифиркам есть ключ -n
- Сорт учитывает локаль
- sort работает с полями, и можно указать ключевое
- Сортировка нестабильная, бля исправления --- -s нужен для испю в скриптах: if cmp -s f1 f2; then ... fi
- diff --- имеет древнюю ист. традицию. Это первый инстр. для сборщика пакетов, поскольку он берёт две разные версии одного файл, и сравнивает их. Причём народ реком. исп. diff -u. Кроме того, есть ключ -e, которые генерирует посл. команд ed, которая преобр. первы во второй. Также вывод диффа можно скормить patch, которая с исп. диффа делает из старого файла новый. Кроме того, если указаны строки до и после изм., то можно патч применять не толдько к исх. файлу.:
patch a1 a2 > p patch a3 < p
- sort --- сортирует файл по строкам в лекс. порядке.
Идея в том, что обычно файл приложится. И если файл не приложится, то это значит, что надо посмотреть на файл. Осн. идея следующ:
- Изм. надо сохр. в виде патча
- Если наложится на новую версию, то хорошо
- Если не наложился, то значит, что надо смотреть
В альте есть пакет patchutils, в котом есть инструменты для редактирования патчей, сравнения патчей.
- uniq (у сорта есть -u, которые делает тоже самое) --- выводит только разные строки в отсорт. файле.
- tac --- выводит файл в обратном порядке
- tr --- подмена символов
- wc --- считает байты, слова, строки
- hexdump, od --- примерно одно и то же, но один в coreutils. Выдают хексдамп.
- strings --- вытравляет строки из бинарников (binutils)
- expr --- программа, которая когда-то вычисл. ариф. выр., но зато она замечательно работает с рег. выр.: expr строка:(регвыр)
- Программы, которые что-то делают с ФС
- Сравнение файлов, выделение того, что в них отлич.
- cmp --- просто сравнивает файлы, если одникаовые --- одинаковые, если разные --- говорит, с какого различ. Есть ключ -q,
- Сравнение файлов, выделение того, что в них отлич.
- find. Работает с ФС, выводит текст. По умолчанию покажет список из всех объектов ФС относительно текущей директории. У find дикое кол-во разного рода ключей. У него дост. специфич. формат: первый парметр --- каталог, а дальше идут предикаты find . -type d -name '*a*'. -exec --- позволяет исп. команду для каждого файла или для всех
- xargs --- одна из немногих программ, которые нач. на x и при этом никакого отн. к иксам не имеет. Позволят обработать прогр. большой список параметров.
- locate --- ищет имя файла по базе, которую надо регулярно обновлять updatedb
- which, whereis --- поиск исп. файла по названия в PATH, man...
- seq, jot --- программы для генерации последовательностей
Оставшиеся 1983 программы лектор опускает.
- Терминал
- Мы знаемЮ что можно запустить программу в фоне, она будет делать вывод в файл, и если админ не извращался, то можно разлогиниться и уйти домой ... нам не хватает вечноживого терминала. Такая штука есть, она называется screen, в bsd-системах есть ещё window. Это средство сделать из одного терминала несколько, их можно отсоединить от того устр, в котором оно было.