Linux sed grep awk

sed - потоковый редактор

Сценарий

sed [-Ealn]command [file ...]
sed [-Ealn] [-e command] [-f command_file] [-i extension] [file ...]


Описание

SED копирует строку из input (стандартный или указываемый набор файлов) в PATTERN SPACE (некоторая область), и к этой строке применяет все команды, адреса которых попадают в PATTERN SPACE . Затем PATTERN SPACE копируется в output . (Фактически в PATTERN SPACE находится одна строка, за исключением команды N , см. Функции SED ).

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

Доступны следующие опции:

-n, --quiet, --silent
   подавлять автоматический вывод пространства шаблонов.

-e сценарий, --expression=сценарий
   добавить сценарий к командам для исполнения

-f файл-сценария, --file=файл-сценария
   добавить содержимое файла сценария к командам для исполнения.

-i[суффикс], --in-place[=суффикс]
   редактировать файлы "на месте" (создает резервную копию, если задан суффикс)

-l N, --line-length=N
   установить желаемую длину строки при переносе строк (line-wrap) для команды `l'

-r, --regexp-extended
   использовать расширенные регулярные выражения

-s, --separate
   рассматривать входные файлы раздельно, а не как один продолжающийся поток

-u, --unbuffered
   загружать как можно меньше данных на входе и сбрасывать как можно чаще буфера на выходе

--help
   отобразить эту подсказку и выйти

-V, --version
   вывести информацию о версии и выйти

При использовании большого сценария возможен следующий способ: создается файл, в котором записываются команды sed, файл делается исполняемым, в начало файла добавляется строка:
#!/bin/sed -f

Форма команд sed следующая:

[address[,address]]function[arguments]

Пробелы (whitespaces) могут быть вставлены до первого адреса и  частями функции команды.

Обычно sed циклически копирует строку ввода, не включая завершающий символ новой строки, в шаблон пробелов, (до тех пор, пока кто-нибудь не оставит ``D'' функцию) применяет все команды с адресами которые выбрали этот шаблон, копирует шаблон на стандартный вывод, добавляя символ новой строки и удаляя шаблон.

Некоторые функции используют hold space, для сохранения всего или части шаблона для последующего поиска.


Адреса Sed

Адрес не обязателен, но если он указан, то адрес должен являться номером (который считает строки входных файлов), знаком доллара ('$') который указывает на последнюю введенную строку или контекстный адрес (который содержит регулярное выражение, которому предшествует и следует за ним разделитель).

Командная строка без адресов выбирает каждый шаблон

Командная строка с одним адресом выбирает все шаблоны, которые совпадают с адресом.

Командная строка с двумя адресами выбирает включительный диапазон. Диапазон начинается с первого шаблона который совпадает с первым адресом. Конец диапазона следующий шаблон, который совпадает со вторым адресом. Если номер второго адреса равно или меньше номера строки первого, в таком случае эта строка будет выбрана.
В случае, когда второй адрес - контекстный адрес, sed не производит повторного  сравнения второго адреса с шаблоном, который совпадает с первым адресом. Начиная с первой строки, сопровождаемой выбранным диапазоном, sed начинает поиск первого адреса снова.

Редактирование команд может применяться к  невыбранным шаблонам, через использование символа (``!'').

Допускается задание адреса в форме 'ПЕРВАЯ~ШАГ', что соответствует каждой строке ШАГ начиная от строки ПЕРВАЯ. Например, "sed -n 1~2p" напечатает все нечётные строки, адреса 2~5 будут соответствовать каждой пятой строке начиная со второй. (Это расширение GNU.)


Регулярные выражения sed

Регулярные выражения используемые в sed, по умолчанию, являются основными регулярными выражениями , но вместо них могут использоваться раширенные (новые) регулярные выражения, если будет использован флаг -E.

Вдобавок, sed имеет следующие дополнения к регулярным выражениям:

1. В контекстном адресе, любой символ отличный от обратного слеша (``\'') или символа новой строки, может использоваться для разграничения регулярного выражения. Так же, использование обратного слеша перед разграничительным символом, заставляет символ являться литерой. Например, в контекстном адресе \xabc\xdefx, разграничивающим символом в регулярном выражении является ``x'', второй ``x'' будет являться литерой, поэтому регулярное выражение будет ``abcxdef''.

2. последовательности \n совпадает с символом новой строки, встроенным в шаблон. Вы не можете использовать литеры символа новой строки в адресе, или команде подмены.

Единственной особенностью присущей регулярным выражениям sed является особенность быть по умолчанию по отношению к последему используемому регулярному выражению. Если регулярное выражение пустое, то`сть указан только разграничивающий символ, в таком случае будет использовано последнее использовавшееся регулярное выражение. Последнее регулярное выражение определяется как последнее использовавшееся регулярное выражение, как часть адреса или команды подмены, во время запуска, а не во время компиляции. Например, команда ``/abc/s//XXX/'' заменит ``XXX'' на шаблон ``abc''.

Для осуществления отбора строк для редактирования, в адресах команд SED допускается использование регулярных выражений, заключенных в "/ /" и определяемых следующим образом:

   * Регулярное выражение указывается в разделителях: "/ /" ;
   * любой символ (кроме специальных: \[.^*$ ) является регулярным выражением себя;
   * ^ в начале регулярного выражения указывает на пустой символ в начале регулярного выражения. (Т.е. на начало строки)
   * $ в конце регулярного выражения указывает на пустой символ в конце регулярного выражения. (Т.е. на конец строки);
   * \n - вставленный newline (новая строка);
   * . - любой символ (кроме обыкновенного newline );
   * * - стоящая за регулярным выражением означает любую последовательность вхождений этого выражения, начиная с 0;
   * \? - стоящий за регулярным выражением означает 0 или 1 вхождений этого выражения;
   * [ ] - указывает на один из символов, приведенных внутри;
   * [^ ] - указывает на один из символов, кроме приведенных внутри;
   * \ - перед любым символом, кроме цифр и "(" , ")" , означает этот символ. ( Экранирование специальных символов).
   * \(x\) -, где x - регулярное выражение, указывает на x .
   * \d -, где d - цифра, указывает копию d -того выражения, которое заключалось в скобки "\(" и "\)" ;
   * конкатенация регулярных выражений является регулярным выражением.

Примеры:

/olga/ - указывает на строки содержащие "olga" , "abcolgadef" ,...;

/ol.*ga/ - указывает на строки, содержащие "olga" , "olabcga" ,....;

/^[Oo]lga/ - на строки, начинающиеся с "Olga" или "olga" ;

/./ - попадают все строки, имеющие хотя бы 1 символ (не newline );

/\./ - попадают строки, содержащие "." ;

/^[^ ]/ - строки, не начинающиеся с " " ;

/\(ol\).*\1/ - строки, содержащие два вхождения "ol" не подряд.


Два пространства

В sed нет переменных, однако есть две области памяти, с которыми можно работать фактически как с переменными. Эти области называют pattern space (пространство образца) и hold space (скорее пространство трюма). В этой статье будем их называть просто: pattern и hold.

Pattern space

pattern содержит последнюю считанную из файла строку (справедливости ради следует сказать, что обе области могут содержать не только одну строку, а множество строк, разделенных символом newline (\n) ). Именно с ней работают основные команды. В pattern читается очередная строка. Здесь помещается результат выполнения некоторых команд

Hold space

hold - это действительно трюм, здесь могут содержаться строки на протяжении всей работы скрипта. Между hold и pattern можно производить обмен данными (добавление, замещение, обмен)


        Функции sed

В следующем списке команд, максимальное количество разрешенных адресов для каждой команды показывается как [0addr], [1addr], или [2addr], представляя ноль, один или два адреса. Аргумент text содержит одну или более строк. Что бы включить символ новой строки в текст, поставьте перед ним символ обратного слеша. Другие символы обратного слеша в тексте удаляются и следующие за ними символы рассматриваются как литеры.

Функции ``r'' и ``w'' берут опциональный параметр файла, который должен быть отделен от функционального символа пробелом (whitespace). Каждый файл, заданный как аргумент для sed'а, создается (или содержимое его урезается) прежде, чем начнется любая обработка ввода.

Функции ``b'', ``r'', ``s'', ``t'', ``w'', ``y'', ``!'', и ``:'' принимают дополнительные аргументы. Следующий пример показывает, какие аргументы должны быть отделены из символов функций, пробелами (whitespaces).

Две функции составляют список функций. Список функций sed разделяется символами  новой строки, как показано в следующим примере:

{ function
 function
 ...
 function
}

``{'' может предворяться пробелом и сопровождаться пробелом. Функции могут  предворяться пробелом. Звершающая ``}'' может пердворяться символом новой строки или пробелом.

[2addr]function-list  Запускает  список функций только, когда выбран шаблон.

[1addr]a\
  text  Добавить "text" после указанной строки (вывести), потом считать следующую. Команда не изменяет значение номера строки.

[2addr]b[label]  Перейти к команде :, содержащей label. Если метка пуста, перейти на конец сценария.

[2addr]c\
  text  Удалить pattern space и вывести "text" на output. Команда не изменяет значение номера строки.

[2addr]d  Удалить pattern space. Все команды после этой команды не исполняются. После выполнения команды считывается следующая строка файла и выполнение команд начинается сначала. Влияет на счётчик строк.

[2addr]D  Удалить pattern space до вставленной newline.

[2addr]g  Заместить содержимое pattern space содержимым буфера hold space.

[2addr]G  Добавить к содержимому pattern space символ новой строки, сопровождаемый содержимым hold space.

[2addr]h  Заместить содержимое буфера hold space на содержимое pattern space.

[2addr]H  Добавить к содержимому буфера hold space символ новой строки, сопровождаемый содержимым pattern space.

[1addr]i\
   text  Вывести текст на output перед указанной строкой. Команда не изменяет значение номера строки.

[2addr]l (буква эль). Записывает шаблон на стандартный вывод в визуально однозначной форме. Эта форма следующая:
обратный слэш               \\
сигнал                      \a
form-feed                   \f
возврат каретки             \r
табуляция                   \t
вертикальня табуляция       \v

Непечатные символы записываются как трехзначные восмеричные номера (предваряемые обратным слешем) для каждого байта в символе (наиболее важные байты сначала).
Длинные строки переносятся с указанием точки переноса в виде обратного слеша  сопровождаемого символом новой строки. Конец каждой строки указан символом ``$''.

[2addr]n  Вывести pattern space на output и считать следующую строку. Прекращает выполнение команд скрипта для текущей строки.

[2addr]N  Добавить следующую строку к pattern space , разделяя строки вставленным newline.

[2addr]p  Скопировать pattern space на output.

[2addr]P  Скопировать pattern space до первой вставленной newline на output.

[1addr]q  Переход на конец input . Вывести указанную строку, (если нет флага -n ) и завершить работу SED.

[1addr]r  Читать содержимое rfile и вывести его на output прежде чтения следующей строки. Если file не может быть прочитан,  по любой причине, он тихо игнорируется и состояние ошибки не устанавливается.

[2addr]t [label]
Проверить. Перейти к команде :, содержащей label, если со времени последнего чтения входной строки или последнего выполнения команды t в буфере выполнялись подстановки (с помощью функции "s"). Если метка пуста, перейти на конец сценария.

[2addr]w  Добавить pattern space к концу файла wfile. (Максимально можно использовать до 10 открытых файлов.) При первом выполнении w файл будет стёрт. При последующих вызовах w будет выполняться добавление. При каждом выполнении команды sed файл перезаписывается.

[2addr]x  Поменять местами содержимое pattern space и буфера hold space.

[2addr]y/str1/str2/
Заменить все вхождения символов из str1 на соответствующие из str2 . Длины строк должны быть равными.

[2addr]!function
[2addr]!function-list
Применяет функцию или список функций ({}) только для строк которые не выбраны адресом.

[0addr]:label
Устанавливает метку для перехода по "b" и "t" командам.

[1addr]=  Выводит номер строки на output как строку.

[2addr]{ - Выполняет функции до "}" , только когда выбрано pattern space . Группировка функций.

[0addr]  Пустая команда игнорируется.

[0addr]#  Комментарии.


        Функция контекстной замены

Формат:

[2addr]s/< Регулярное выражение > /< Замена > /< флаги >

Функция s заменяет вхождение < Регулярного выражения > в pattern space на < Замену > .

< Регулярное выражение > : Аналогично выше данному, но может быть заключено не в "/ /" а в любые другие символы (не " " (пробел) и не newline ).

< Замена > : Любой набор символов. Используются специальные символы:

"& " - Заменяется на строку, указанную в регулярном выражении.

"\d" - , где d - цифра, указывает на d -тое выражение, заключенное в "\(","\)" в регулярном выражении.

< Флаги > :

N - Создавать замену только для N' повторений регулярного выражения в шаблоне.

g - Глобальная замена: заменить все вхождения в строке.

p - Печатать (выводить на output ) строки, в которых была осуществлена замена.

w wfile - Выводить в файл wfile строки, в которых была осуществлена замена. Если замещаемая строка совпадает с замещаемой, она все еще расценивается как замещение.

Примеры:

s/to/by/w changes - Заменить в тексте первое вхождение "to" в каждой строке, если таковое есть, на "by" и измененные строки сохранить в файле "changes" .

/iiii/s/[Oo]lga/ Olga V.Galina/p - Заменить в тексте, в строках, где встречается вхождение "iiii" , первое вхождение подстроки "olga" или "Olga" на " Olga V.Galina" , при этом измененные строки выводить на печать.

s/[.,;:?]/*sign& *sign& **/g - Заменить в тексте каждое вхождение одного из знаков ".,;:?" в строку на "*sign& *" , где & будет тем знаком, который стоял прежде, например, "." на "*sign.*" , "?" на "*sign?*" и т. д.



Литерал
http://www.opennet.ru/base/dev/sed1line.txt.html
https://exebit.wordpress.com/tag/sed-regexp-unix-llinux-parse/
https://lin.in.ua/articles/17-Konsol/53-Odno_strochnye_skripty_SED.html
https://sites.google.com/site/vanyambauseslinux/home/vvod-i-vyvod-v-terminale
http://s3blog.org/grep-poisk-fajla-s-nuzhnym-soderzhimym.html
http://webguruz.ru/ubuntu/grep-example/






Комментарии