UNИX, весна 2008, 12 лекция (от 30 апреля)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Диктофонная запись: http://esyr.org/lections/audio/uneex_2008_summer/uneex_08_04_30.ogg

Содержание

[править] Регэкспы, чать 3

[править] Что есть

  • Символ
  • .
  • [...] [^...]
  • +
  • * ? + {,}
  • (). Эти скобки, в тех рег. выр, где используется ссылки, скобки нумеруются по порядку их появления в рег. выр.. При этом, если скобка повторяется, то попадает в регистр только первое совпадение, то есть для рег выр ((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

Идея в том, что обычно файл приложится. И если файл не приложится, то это значит, что надо посмотреть на файл. Осн. идея следующ:

  • Изм. надо сохр. в виде патча
  • Если наложится на новую версию, то хорошо
  • Если не наложился, то значит, что надо смотреть

В альте есть пакет 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. Это средство сделать из одного терминала несколько, их можно отсоединить от того устр, в котором оно было.


UNИX, весна 2008


Лекции

01 02 03 04 05 06 07 08 09 10 11 12 13 14


Календарь

Февраль
13 20 27
Март
05 12 19 26
Апрель
02 09 16 23 30
Май
07 14
Семинары

01 02 03 04 05 06 07


Календарь

Март
21
Апрель
04
Май
16 30
Июль
11 18
Август
15


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

Эта статья ещё не вычитана. Пожалуйста, вычитайте её и исправьте ошибки, если они есть.
Личные инструменты
Разделы