sed & awk / sed & awk: 2.4 Использование awk
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Аналогично sed, awk исполняет набор инструкций для каждой входной строки. Вы можете указать инструкции в командной строке или создать скрипт r0mk 01.10.12 в 06:13 |
|
|
2.4.1 Запуск awk r0mk 01.10.12 в 06:13 |
||
|
Синтаксис командной строки следующий: r0mk 01.10.12 в 06:14 |
||
|
awk 'инструкции' файл r0mk 01.10.12 в 06:14 |
||
|
На вход читаются строки из одного или нескольких файлов или со страндартного входа. Инструкции должны быть выделелны одинарными кавычками для защиты их от шелла. (Инструкции почти всегда содержат фигурные скобки и/или знак доллара, которые интерпретируются шеллом как специальные символы.) Множественные строки команд могут быть введены так же, как и в sed: с разделением команд через точку с запятой или используя совместимость с многострочным вводом в Bourne shell. r0mk 01.10.12 в 06:43 |
||
|
Программа awk обычно помещается в файл, гдк она может быть протестирована и изменена. Синтаксис вызова awk с файлом скрипта следующий: r0mk 01.10.12 в 06:44 |
||
|
awk -f скрипт файлы r0mk 01.10.12 в 06:44 |
||
|
Опция -f работает так же как и в sed. r0mk 01.10.12 в 06:53 |
||
|
В то время как инструкции awk имеют такую же структуру как sed, содержат шаблоны и разделы процедур, сами процедуры довольно различны. Здесь awk менее похож на текстовый радактор и более на язык программирования. Здесь операторы и функции вместо одно- или двух-символьных последовательностей команд. Для примера, Вы оператор print для печати значений выражения или для печати содержания текущей строки. r0mk 01.10.12 в 07:03 |
||
|
Awk, в обычном случае, интерпретирует каждую входную строку как запись и каждое слово, как строку, разделенные пробелами или табами, как поля. (Это правило может быть изменено.) Один или несколько последовательных пробелов или табов считаются как один разделитель. Awk позволяет Вам ссылаться на эти поля в шаблонах или процедурах. $0 представляет всю входную строку. $1, $2, ... ссылаются на отдельные поля во входной строк. Awk разделяет входные записи до обработки скриптом. Давайте рассмотрим несколько примеров, используя прострой входной файл список. r0mk 01.10.12 в 07:39 |
||
|
Первый пример содержит одиночную инструкцию, которая печатает первое поле каждой строки во входном файле. r0mk 01.10.12 в 07:40 |
||
|
$ awk '{ print $1 }' list r0mk 01.10.12 в 07:40 |
||
|
John r0mk 01.10.12 в 07:40 |
||
|
Alice r0mk 01.10.12 в 07:40 |
||
|
Orville r0mk 01.10.12 в 07:40 |
||
|
Terry r0mk 01.10.12 в 07:40 |
||
|
Eric r0mk 01.10.12 в 07:40 |
||
|
Hubert r0mk 01.10.12 в 07:41 |
||
|
Amy r0mk 01.10.12 в 07:41 |
||
|
Sal r0mk 01.10.12 в 07:41 |
||
|
"$1" указывает на значение первого поля в каждой строк. Т.к. шаблон не указан, то оператор печати применяется ко всем строкам. В следующем примере шаблон "/MA/" указан, но без процедуры. Действием по-умолчанию является печать каждой строки, удовлетворяютщей шаблону. r0mk 01.10.12 в 07:51 |
||
|
$ awk '/MA/' list r0mk 01.10.12 в 07:51 |
||
|
John Daggett, 341 King Road, Plymouth MA r0mk 01.10.12 в 07:52 |
||
|
Eric Adams, 20 Post Road, Sudbury MA r0mk 01.10.12 в 07:52 |
||
|
Sal Carpenter, 73 6th Street, Boston MA r0mk 01.10.12 в 07:52 |
||
|
Три строки были напечатаны. Как было упомянуто в первой главе, awk может быть использован как язык запросов, для извлечения нужной информации из файлов. Мы можем сказать, что шаблон помещенный в условие выбора записей будет включет в отчет, а именно они должны содержать строки "MA". Сейчас мы можем, так же, указать какую часть записей включать в отчет. Следующий пример использует оператор печати для ограничения вывода до первого поля каждой записи. r0mk 01.10.12 в 07:57 |
||
|
$ awk '/MA/ { print $1 }' list r0mk 01.10.12 в 07:52 |
||
|
John r0mk 01.10.12 в 09:05 |
||
|
Eric r0mk 01.10.12 в 09:05 |
||
|
Sal r0mk 01.10.12 в 09:05 |
||
|
Для помощи в понимании выше указанных инструкций мы попробуем прочитать это вслух: Печатать первое слово в каждой строке, содержащей строку "МА". Мы можем сказать"слово" потому, что по-умолчанию awk разделяет входные поля пробелами или табами. r0mk 01.10.12 в 09:29 |
||
|
В следующем примере, мы используем опцию -F для изменения разделителя полей. Это позволяет нам запросить любые три поля: полное имя, адрес, или город и штат. r0mk 01.10.12 в 09:30 |
||
|
$ awk -F, '/MA/ { print $1 }' list r0mk 01.10.12 в 09:31 |
||
|
John Daggett r0mk 01.10.12 в 09:31 |
||
|
Eric Adams r0mk 01.10.12 в 09:31 |
||
|
Sal Carpenter r0mk 01.10.12 в 09:31 |
||
|
Не путайтесь, -F опция меняет разделитель полей, а опция -f указывает имя файла скрипта. r0mk 01.10.12 в 09:37 |
||
|
В следующем примере, мы напечатаем каждое поле в отдельной строке. Множественные команды отделяются через точку с запятой. r0mk 01.10.12 в 09:38 |
||
|
awk -F, '{ print $1; print $2; print $3 }' list r0mk 01.10.12 в 09:38 |
||
|
John Daggett r0mk 01.10.12 в 09:38 |
||
|
341 King Road r0mk 01.10.12 в 09:38 |
||
|
Plymouth MA r0mk 01.10.12 в 09:39 |
||
|
Alice Ford r0mk 01.10.12 в 09:39 |
||
|
22 East Broadway r0mk 01.10.12 в 09:39 |
||
|
Richmond VA r0mk 01.10.12 в 09:39 |
||
|
Orville Thomas r0mk 01.10.12 в 09:39 |
||
|
11345 Oak Bridge Road r0mk 01.10.12 в 09:39 |
||
|
Tulsa OK r0mk 01.10.12 в 09:39 |
||
|
Terry Kalkas r0mk 01.10.12 в 09:39 |
||
|
402 Lans Road r0mk 01.10.12 в 09:40 |
